我需要对一个复杂的数组进行排序和合并!数组是多维的,子数组使用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
)
)
我希望我的解释足够明确。
答案 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);