2013-04-30 80 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; 
}