сортировка многомерного массива в переполнении стека

У меня есть массив массивов, как таковой

$statuses = array(
[0] => array('id'=>10, 'status' => 'active'),
[1] => array('id'=>11, 'status' => 'closed'),
[2] => array('id'=>12, 'status' => 'active'),
[3] => array('id'=>13, 'status' => 'stopped'),
)

Я хочу иметь возможность создавать новый массив массивов, и каждый из этих вложенных массивов будет содержать элементы на основе, если бы они имели одинаковый статус.
Хитрость в том, что я не хочу делать проверку на основе жестко закодированных имен состояний, поскольку они могут быть случайными. Я хочу в основном провести динамическое сравнение и сказать: «Если вы уникальны, то создайте новый массив и оставайтесь там, если массив уже существует с таким же состоянием, как у меня». Пример результата может выглядеть примерно так.

У меня действительно была проблема с этим, потому что единственный способ, которым я могу думать, это проверить каждый элемент на предмет соответствия каждому другому элементу, и, если он уникален, создать новый массив. Это быстро выходит из-под контроля, если исходный массив больше 100. Должно быть несколько встроенных функций, которые могут сделать это эффективным.

<?php
$sortedArray = array(
['active'] => array(
array(
'id' => 10,
'status' => 'active'
),
array(
'id' => 12,
'status' => 'active'
)
),
['closed'] => array(
array(
'id' => 11,
'status' => 'active'
)
),
['stopped'] => array(
array(
'id' => 13,
'status' => 'active'
)
),
)

0

Решение

$SortedArray = array();
$SortedArray['active'] = array();
$SortedArray['closed'] = array();
$SortedArray['stopped'] = array();

foreach($statuses as $Curr) {
if ($Curr['status'] == 'active') { $SortedArray['active'][] = $Curr; }
if ($Curr['status'] == 'closed') { $SortedArray['closed'][] = $Curr;  }
if ($Curr['status'] == 'stopped') { $SortedArray['stopped'][] = $Curr;  }
}
0

Другие решения

Вы также можете сделать это с функциональным способом, хотя это почти так же, как Марк сказал.

$sorted = array_reduce($statuses, function($carry, $status) {
$carry[$status['status']][] = $status;
return $carry;
}, []);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector