2012-10-16 90 views
0

可能重複:
How do I sort a multidimensional array in php排序和合並多維arrray基於子陣列值

我需要梳理和合並複雜的陣!陣列是多維度的子陣列使用這樣2鍵/值:

<?php 
$result = array(
array("1", "20"), 
array("1", "33"), 
array("2", "10"), 
array("2", "25"), 
array("2", "7"), 
array("3", "33"), 
array("3", "80"), 
array("4", "300") 
); 
print_r($result); 
?> 

現在我需要基於鍵的聚合對它進行排序[1]的值(在子陣列),其中鍵的值[0]是類似和合並,然後從多到少排序!例如在上面我喜歡的結果是:

Array 
(
    [0] => Array 
     (
      [0] => 4 
      [1] => 300 
     ) 

    [1] => Array 
     (
      [0] => 3 
      [1] => 113 
     ) 

    [2] => Array 
     (
      [0] => 1 
      [1] => 53 
     ) 

    [3] => Array 
     (
      [0] => 2 
      [1] => 42 
     ) 

) 

我希望我的解釋足夠清楚。

+1

我讀了所有的人!這不是我的問題,爲什麼你只是對問題持否定態度?我害怕在這個問題上提出問題:) – Vahid

+0

對,你首先需要分解你的問題。一部分是做聚合,第二部分是做這種分類。但是兩者都被覆蓋了。 – hakre

+0

也許你是對的,我沒有足夠的陣列,我搜索了每個地方解決它自己,但我不能! – Vahid

回答

1

這裏的關鍵是array_multisort函數,但它需要一些工作才能以正確的格式獲得輸入。看看下面的代碼。首先我們累積這些值,然後將它分成一個索引數組和一個數組數組,然後用multisort對它進行排序併合併到一起。

$result2 = array(); 
foreach($result as $pair) { 
    if (!isset($result2[$pair[0]])) 
     $result2[$pair[0]] = 0; 
    $result2[$pair[0]] += $pair[1]; 
} 
$array1 = array(); 
$array2 = array(); 
foreach($result2 as $key => $value) { 
    array_push($array1, $key); 
    array_push($array2, $value); 
} 
array_multisort($array2, SORT_DESC, $array1); 
$result3 = array(); 
for ($i = 0; $i < count($array1); $i++) { 
    array_push($result3, array($array1[$i], $array2[$i])); 
} 
print_r($result3); 
+0

謝謝,就是這樣。 – Vahid

0

在您的具體情況下,您可以將兩個操作(聚合總和,創建排序數組)合併爲一個迭代。

但是代碼變得難於閱讀:

list($sort, $result) = array_reduce($result, function($a, $v) { 
    $a[1][$v[0]] = [$v[0], (@$a[0][$v[0]] += $v[1])]; 
    return $a; 
}, []); 

array_multisort($sort, SORT_NUMERIC, SORT_DESC, $result);