2012-03-18 161 views
1

所以我有這個數組。按鍵值對數組排序

Array 
(
    [0] => Array 
     (
      [key_1] => something 
      [type] => first_type 
     ) 

    [1] => Array 
     (
      [key_1] => something_else 
      [type] => first_type 
     ) 

    [2] => Array 
     (
      [key_1] => something_else_3 
      [type] => second_type 
     ) 

    [3] => Array 
     (
      [key_1] => something_else_4 
      [type] => second_type 
     ) 
) 

我有類型值在這樣的模式來進行排序:

first_type 
second_type 
first_type 
second_type 

我的問題是,我該怎麼辦呢?

非常感謝!

+0

我想你必須自己寫這個; '[type]'嵌套在它自己的數組中意味着標準的PHP函數會發現這個棘手的問題,儘管您應該嘗試使用sort()和朋友來查看它們吐出的內容。 – Bojangles 2012-03-18 17:15:42

+1

您首先應該更清楚您的排序模式。我甚至沒有看到你說過有一個。那麼你的排序規範是什麼? – hakre 2012-03-18 17:30:01

+0

比方說,我有類型鍵,值可以是1或2.我需要像這樣排序:1 2 1 2 1 2 1 2 ...等 – 2012-03-18 17:32:13

回答

0

因此,這裏是我如何得到它的工作:

function filter_by_value($array, $index, $value) { 
    if(is_array($array) && count($array) > 0) { 
     foreach(array_keys($array) as $key){ 
      $temp[$key] = $array[$key][$index]; 
      if ($temp[$key] == $value){ 
       $newarray[$key] = $array[$key]; 
      } 
     } 
    } 
    return $newarray; 
} 
$array = /* array here */ 
$type1 = array_values(filter_by_value($array, 'type', '1')); 
$type2 = array_values(filter_by_value($array, 'type', '2')); 
$i = 1; $x = 1; $y = 1; 
$sorted = array(); 
foreach ($array as $a) { 
    if ($i % 2) { 
     $sorted[$i-1] = $type1[$x-1]; 
     $x++; 
    } else { 
     $sorted[$i-1] = $type2[$y-1]; 
     $y++; 
    } 
    $i++; 
} 

找到filter_by_value()在php.net上,但我不記得在哪裏,這不是由我做的。 也許這不是最好的解決方案,但它工作得很好。

0

如果sort()及其相關替代方法不起作用,則必須使用usort()uasort()以及自定義函數對此數組進行排序。

6

您需要使用usort和自定義比較功能,比較每個項目的key_1子鍵(您可以使用strcmp來方便地完成此操作)。假設你不想改變所得陣列的結構,它會是這個樣子:

$arr = /* your array */ 
usort($arr, function($a, $b) { return strcmp($a['key_1'], $b['key_1']); }); 
+0

這樣對數組排序如下:All first_type then all second_type。但我需要它像這樣first_type |排序second_type | first_type | second_type |等等謝謝! – 2012-03-18 17:52:57

+0

@ Vlad.P:「sort」是錯誤的動詞來形容你想要做什麼... – Jon 2012-03-18 20:06:21

+0

對不起,也許安排更具描述性? – 2012-03-18 20:34:26