2016-07-20 4 views
0

У меня есть массив массивов, так как такиесортировки мульти двумерный массив в PHP

$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' 
     ) 
    ), 
) 
+5

'foreach ($ arr as $ child) {$ newarr [$ child ['status']] [] = $ child; } ' –

+0

Ну, я буду проклят. Это сработало отлично. Я собирался сделать что-то смехотворно сложное. благодаря!!!! –

ответ

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

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

$sorted = array_reduce($statuses, function($carry, $status) { 
    $carry[$status['status']][] = $status; 
    return $carry; 
}, []); 
Смежные вопросы