基于子数组值对多维数组进行排序和合并

时间:2012-10-16 21:20:25

标签: php arrays sorting multidimensional-array

  

可能重复:
  How do I sort a multidimensional array in php

我需要对一个复杂的数组进行排序和合并!数组是多维的,子数组使用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);
?>

现在我需要根据key [1]值(在子数组中)的聚合来对它进行排序,其中keys [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
        )

)

我希望我的解释足够明确。

2 个答案:

答案 0 :(得分:1)

这里的关键是array_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);

答案 1 :(得分: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);
相关问题