2012-10-16 55 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);