2016-07-20 33 views
0

I ein Array von Arrays haben, als solcheeine mehrdimensionale Array in PHP Sortier

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

Ich möchte, auf ein neues Array von Arrays machen zu können und jeder dieser Subarrays würden, die Elemente enthalten, basierend wenn sie den gleichen Status hatten. Der Trick hier ist, ich möchte nicht eine Fallprüfung basierend auf hart codierten Statusnamen tun, da sie zufällig sein können. Ich möchte im Grunde genommen einen dynamischen Vergleich machen und sagen "wenn du einzigartig bist, dann erstelle ein neues Array und bleibe dort drin, wenn ein Array bereits existiert mit dem gleichen Status als mich dort rein zu stecken". Ein Beispielergebnis könnte in etwa so aussehen.

Ich hatte wirklich eine Herausforderung mit diesem, weil die einzige Möglichkeit, ich denke, es zu tun ist, jedes einzelne Element gegen jedes andere einzelne Element zu überprüfen, und wenn einzigartig, als ein neues Array zu erstellen. Dies gerät schnell außer Kontrolle, wenn das ursprüngliche Array größer als 100 ist. Es muss einige eingebaute Funktionen geben, die dies effizient machen können.

<?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 als $ Kind) {$ newarr [$ Kind ['Status']] [] = $ Kind; } ' –

+0

Nun, ich werde verdammt sein. Das hat perfekt funktioniert. Ich würde etwas lächerlich Kompliziertes machen. Vielen Dank!!!! –

Antwort

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

Sie es auch mit funktional tun können, obwohl es ziemlich das gleiche ist wie gesagt Marc.

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