2017-07-18 3 views
0

Ich habe ein Array von Arrays. Jedes verschachtelte Array enthält zwei Elemente, die durch Kommas getrennte Werte sind. Was ich tun möchte, ist diese verschachtelten Arrays in mehrere Arrays zu zerlegen.Möglicher einfacherer Weg, verschachtelte Arrays zu teilen

So zum Beispiel, wenn ich die folgenden Array von Arrays habe ...

Array 
(
    [0] => Array 
     (
      [a] => 'single value', 
      [b] => '1,2', 
      [c] => 'left, right' 
    ], 

    [1] => Array 
     (
      [a] => 'single value', 
      [b] => '4,5', 
      [c] => 'top, middle' 
     ) 
) 

... Ich würde letztlich mit dem folgenden, am Ende mag.

Array 
(
    [0] => Array 
     (
      [a] => 'single value', 
      [b] => '1', 
      [c] => 'left' 
     ) 

    [1] => Array 
     (
      [a] => 'single value', 
      [b] => '1', 
      [c] => 'right' 
     ) 

    [2] => Array 
     (
      [a] => 'single value', 
      [b] => '2', 
      [c] => 'left' 
     ) 

    [3] => Array 
     (
      [a] => 'single value', 
      [b] => '2', 
      [c] => 'right' 
     ) 

    [4] => Array 
     (
      [a] => 'single value', 
      [b] => '4', 
      [c] => 'top' 
     ) 

    [5] => Array 
     (
      [a] => 'single value', 
      [b] => '4', 
      [c] => 'bottom' 
     ) 

    [6] => Array 
     (
      [a] => 'single value', 
      [b] => '5', 
      [c] => 'top' 
     ) 

    [7] => Array 
     (
      [a] => 'single value', 
      [b] => '5', 
      [c] => 'bottom' 
     ) 
) 

Ich kann dies erreichen mit einer Reihe von verschachtelten foreach-Schleifen, aber das scheint wirklich ineffizient - vor allem in Anbetracht der Tatsache, dass einige b und c Werte viele Elemente enthalten kann.

$new_array = []; 
foreach($array as $a) 
{ 
    foreach(explode(',', $a['b']) as $b) 
    { 
     foreach(explode(',', $a['c']) as $c) 
     { 
      $d = [ 
       'a' => $a['a'], 
       'b' => $b, 
        'c' => $c 
       ]; 
       $new_array[] = $d; 
      } 
    } 
} 

Gibt es eine bessere Möglichkeit, diese mit Array-Funktionen zu trennen?

Dank

+0

Warum denken Sie, das ist ineffizient? Die Anzahl der Elemente, die Sie zu Ihrem neuen Array hinzufügen, ist genau die Anzahl der Male, die es passieren muss ... Sie können das nicht reduzieren. Diese Frage ist jedoch für StackOverflow nicht verfügbar. Sie könnten versuchen [CodeReview] (https://codereview.stackexchange.com), aber ich würde in Betracht ziehen, die Frage alle zusammen fallen zu lassen. – trincot

Antwort

0

Ich denke, dass Ihre Lösung ist OK. In meinem Beispiel habe ich eine rekursive Funktion verwendet, um eine der verschachtelten Schleifen zu "verstecken" und etwas Speicher zu sparen, indem ich die verarbeiteten Elemente entfernt habe (im Beispiel von array_shift).

function rotate($array, $new_array = array()) { 
    $sub_array = array_shift($array); 
    $sub_array['b'] = explode(',', $sub_array['b']); 
    $sub_array['c'] = explode(',', $sub_array['c']); 

    while($b = array_shift($sub_array['b'])) { 
    foreach($sub_array['c'] as $c) { 
     $new_array[] = array('a' => $sub_array['a'], 'b' => $b, 'c' => $c); 
    } 
    } 
    return $array ? rotate($array, $new_array) : $new_array; 
} 

$new_array = rotate($array); 
Verwandte Themen