/ / sort і merge багатовимірного arrray на підставі значень суб-масиву [дублювати] - php, масиви, сортування, багатовимірний масив

сортування та злиття багатовимірного масиву на основі значень суб-масиву [дублікат] - php, масиви, сортування, багатовимірний масив

Можливі дублікати:
Як сортувати багатовимірний масив у 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);
?>

тепер мені потрібно відсортувати її на основі агрегації ключів [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 для відповіді № 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);

0 для відповіді № 2

У вашому конкретному випадку, ви можете згорнути дві операції (сукупні суми, створити сортування масиву) в одну ітерацію.

Однак коду стає важко читати:

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);