2010-03-18 15 views

Antwort

8

Nicht sicher, es wird Ihnen passen, wie es PHP ist> = 5,3 nur, aber hier ist eine mögliche Lösung, mit array_walk_recursive und einen Verschluss(siehe Anonymous functions):

$array = array(
    array(1, 2, 3), 
    array(4, 5, 6), 
    array(7), 
); 

$result = array(); 
array_walk_recursive($array, function ($value, $key) use (& $result) { 
    $result[] = $value; 
}); 
var_dump($result); 

Und das Ergebnis:

array 
    0 => int 1 
    1 => int 2 
    2 => int 3 
    3 => int 4 
    4 => int 5 
    5 => int 6 
    6 => int 7 

Grundlegend ist die Schließung der einzige Weg, ich habe dies zu wo rk: Es wird verwendet, um die $result Variable als Referenz in die anonyme Funktion zu importieren.



Und nur um es zu veröffentlichen, die nur habe ich diese Arbeit für PHP 5.2 (dh nicht einen Verschluss mit) ist dies mit:

$result = array(); 
array_walk_recursive($array, 'my_func', & $result); 
var_dump($result); 

function my_func($value, $key, & $result) { 
    $result[] = $value; 
} 

Welche funktioniert zu - aber löst eine Warnung aus:

Deprecated: Call-time pass-by-reference has been deprecated 

Leider fand ich keinen Weg, dies zu bekommen, ohne $result bei Call-Zeit in Abhängigkeit von vorbei zu arbeiten :-(
(Vielleicht hat jemand anderes hat eine Idee, wie das zu tun?)

+0

+1. Obwohl ich eine Antwort habe, die keine Schließungen verwendet, war dies mein erster Gedanke, wie es geht. Das Beantworten von PHP-Fragen wird mehr Spaß machen, wenn PHP5.3 häufiger wird. – Yacoby

+0

@Yacoby: PHP 5,3 FTW! * (Anonyme Funktionen und Schließungen sind eine Sache, die ich wirklich gerne nutzen könnte, bei der Arbeit ... Aber wir verwenden PHP 5.2 ;-() * –

1

eine array_merge() an jedem separaten Element do.

$test = Array 
(
    "0" => Array 
     (
      0 => 1, 
      1 => 2, 
      2 => 3, 
     ), 
    "1" => Array 
     (
      0 => 4, 
      1 => 5, 
      2 => 6, 
     ), 
    "2" => Array 
     (
      0 => 7, 
     ) 
); 

print_r(array_merge($test[0],$test[1],$test[2])); 
// Array ([0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7) 
1

unter 5.3 php sollte dies wirklich schön und praktisch sein, da die Array-Elemente von array_reduce verwendet interpretiert werden als gemischte anstatt feste als integer

so

print_r(array_reduce($test, 'array_merge')) 

Ich habe es nicht getestet - keine Kopie von 5.3 - zumindest in Theorie das sollte es tun. Unter < 5.3 erhalten Sie Fehler.

Beachten Sie, dass dies nur die oberste Ebene des Arrays zusammenführt, im Gegensatz zur Lösung mit array_walk_recursive.

+1

+1 für die kürzliche Änderung von array_reduce. Aber Sie müssen eine Anfangsmatrix liefern, mit der Sie beginnen können. array_reduce ($ aNestedArray, 'array_merge', array()) – goat

1
$flattened = call_user_func_array('array_merge', $array); 
Verwandte Themen