2013-04-30 65 views
20

我想基于特定的关键字对我的PHP哈希表进行排序。该数据结构是这样的:基于关键字排序PHP多维数组?

print_r($mydata); 

Array(
[0] => Array 
    (
     [type] => suite 
     [name] => A-Name 
    ) 
[1] => Array 
    (
     [type] => suite 
     [name] => C-Name 
    ) 
[2] => Array 
    (
     [type] => suite 
     [name] => B-Name 
    ) 
) 

我已经试过ksort排序usort,但似乎没有任何工作。我试图根据名称键进行二级排序。

这是使用usort我尝试:

function cmp($a, $b) { 
    return $b['name'] - $a['name']; 
} 

usort($mydata, "cmp"); 

有一个简单的办法做到这一点还是我需要写一个自定义排序功能?

+0

那么你是怎么试试usort? – 2013-04-30 18:28:30

+0

我在问题中添加了我的代码。 – user1216398 2013-04-30 18:31:41

+0

从字符串中减去一个字符串?!?难怪它不起作用,你看看phpdocs网页上的例子吗? http://www.php.net/manual/en/function.usort.php - 具体例子#2 – 2013-04-30 18:46:14

回答

49

思维,更加有用和实用的 http://php.net/manual/en/function.sort.php

function array_sort($array, $on, $order=SORT_ASC){ 

    $new_array = array(); 
    $sortable_array = array(); 

    if (count($array) > 0) { 
     foreach ($array as $k => $v) { 
      if (is_array($v)) { 
       foreach ($v as $k2 => $v2) { 
        if ($k2 == $on) { 
         $sortable_array[$k] = $v2; 
        } 
       } 
      } else { 
       $sortable_array[$k] = $v; 
      } 
     } 

     switch ($order) { 
      case SORT_ASC: 
       asort($sortable_array); 
       break; 
      case SORT_DESC: 
       arsort($sortable_array); 
       break; 
     } 

     foreach ($sortable_array as $k => $v) { 
      $new_array[$k] = $array[$k]; 
     } 
    } 

    return $new_array; 
} 

如何使用

$list = array(
    array('type' => 'suite', 'name'=>'A-Name'), 
    array('type' => 'suite', 'name'=>'C-Name'), 
    array('type' => 'suite', 'name'=>'B-Name') 
); 

$list = array_sort($list, 'name', SORT_ASC); 

array(3) { [0]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "A-Name" } [2]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "B-Name" } [1]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "C-Name" } } 
+1

即是一个极其复杂的解决方案。 – deceze 2017-09-22 07:36:44

+0

@deceze嗨!感谢评论和downvote。你能证明你的意见吗?提前致谢。 – voodoo417 2017-09-28 18:44:30

+0

'usort($ MYDATA,函数($ A,$ B){返回STRCMP($ A [ '名'],$ B [ '名']);})' - 考虑到这工作完全正常,是的,我你会说你的过于复杂。 – deceze 2017-09-28 19:12:23

1

array_multisort() - 排序多个或多维数组

+0

这比PHP手册更友好:http://www.youtube.com/watch?v=zBaHBmZLDxY – Kamil 2013-04-30 18:21:13

5

试试这个usort功能:

function cmp($a, $b){ 
     if ($a == $b) 
      return 0; 
     return ($a['name'] < $b['name']) ? -1 : 1; 
    } 

$my_array = array(
0 => array 
    (
     'type' => 'suite' 
     ,'name' => 'A-Name' 
    ) 
,1 => array 
    (
     'type' => 'suite' 
     ,'name' => 'C-Name' 
    ) 
,2 => array 
    (
     'type' => 'suite' 
     ,'name' => 'B-Name' 
    ) 
); 


usort($my_array, "cmp"); 

如果在类使用它,所述第二参数的变化,以这样的数组:

usort($my_array, array($this,'cmp')); 
1
<?php 
$a=array(
array('a'=>5,'b'=>7),array('c'=>4,'d'=>2),array('e'=>0,'f'=>12) 

    ); 
function cmp_sort($x,$y){   //your function to compare two keys 
if($x===$y) 
    return 0; 
else 
    return ($x<$y?1:-1); 
} 

uasort($a,'cmp_sort'); //call user-defined compare function 
print_r($a);    //printing the sorted array 


?> 

输出=>

阵列([2] =>数组(阵列([c] => 4 [d] => 2)[0] =>阵列([a] => 5 [b] => > 7))

0
$this->aasort($array,"key"); 

function aasort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 

    foreach ($array as $ii => $va) { 
     $sorter[]=$va[$key]; 
    } 

    arsort($sorter); 

    foreach ($sorter as $ii => $va) { 
     $ret[]=$array[$ii]; 
    } 

    return $array=$ret; 
} 
0

试试这个递归模式,我在Magento的REST API使用:

$parameters = ['searchCriteria' => ['currentPage' => 1, 'pageSize' => 20]]; 
$parameters['searchCriteria']['filter_groups'][0]['filters'][0] = ['condition_type' => 'from', 'field' => 'updated_at', 'value' => '2017-01-01T00:00:00']; 
$parameters['searchCriteria']['filter_groups'][1]['filters'][0] = ['condition_type' => 'to', 'field' => 'updated_at', 'value' => '2017-12-31T23:59:59']; 

function sortArrayByKeyAsc($_params){ 
    if(is_array($_params)){ 
     uksort($_params, 'strnatcmp'); 
     foreach ($_params as $key => $value){ 
      if(is_array($value)){ 
       $_params[$key] = sortArrayByKeyAsc($value); 
      } 
     } 
    } 
    return $_params; 
}