Wenn Sie versuchen, die Beispieldaten des OP mit dem splat-Operator ( ...
) zu entpacken , generieren Sie:
Schwerwiegender Fehler: Nicht erfasst Fehler: Array kann nicht mit Zeichenfolgenschlüsseln entpackt werden
Beweis
Um diesen Fehler array_values()
zu beheben, rufen Sie auf, um die Schlüssel der ersten Ebene vor dem Entpacken zu indizieren.
var_export(array_map(null, ...array_values($foo)));
Ausgabe:
array (
0 =>
array (
0 => 'a1',
1 => 'b1',
2 => 'c1',
),
1 =>
array (
0 => 'a2',
1 => 'b2',
2 => 'c2',
),
2 =>
array (
0 => 'a3',
1 => 'b3',
2 => 'c3',
),
)
Ein zusätzliches Merkmal / eine Überraschung beim Transponieren mit dieser Technik ist, dass null
Elemente generiert werden, wenn die Subarrays unterschiedliche Größen haben ... aber möglicherweise nicht dort, wo Sie es erwarten.
Aus Beispieldaten wie diesen:
$foo = array(
'a' => array(
1 => 'a1',
2 => 'a2'
),
'b' => array(
1 => 'b1',
3 => 'b3'
),
'c' => array(
1 => 'c1',
2 => 'c2',
3 => 'c3'
)
);
Die Ausgabe ist:
array (
0 =>
array (
0 => 'a1',
1 => 'b1',
2 => 'c1',
),
1 =>
array (
0 => 'a2',
1 => 'b3',
2 => 'c2',
),
2 =>
array (
0 => NULL,
1 => NULL,
2 => 'c3',
),
)
Beachten Sie die Sorgfalt der Funktion (vergleichbar mit den Gepäckabfertigern, die Ihr Gepäck aus dem Bauch des Flugzeugs nehmen). Es gibt keine Aufmerksamkeit auf die ursprünglichen Werte Subarray Ide (und es würde keine Rolle , ob 1
, 2
u 3
waren x
, y
u z
); Was auch immer vom Förderband kommt, wird in den niedrigsten verfügbaren Schlitz geworfen.
Dieses Verhalten ist konsistent und zuverlässig bei der Bereitstellung einer vollständigen Matrix. Eine foreach()
Schleifenalternative liefert nicht nativ null
Elemente aus Subarrays unterschiedlicher Größe, und in den meisten Implementierungen hängt ihre Fähigkeit, auf alle Subarray-Werte zuzugreifen, von der Länge des ersten Subarrays ab.
$foo = array(
'a' => array(
1 => 'a1',
2 => 'a2'
),
'b' => array(
1 => 'b1',
),
'c' => array(
1 => 'c1',
2 => 'c2',
3 => 'c3'
)
);
foreach (current($foo) as $column => $not_used) {
$result[] = array_column($foo, $column);
}
var_export($result);
Ausgabe:
array (
0 =>
array (
0 => 'a1',
1 => 'b1',
2 => 'c1',
),
1 =>
array (
0 => 'a2',
1 => 'c2',
),
)
Wie oben gezeigt, müssen Sie, wenn Sie sicherstellen möchten, dass Sie ALLE Daten aus dem Eingabearray extrahiert haben, eine Additionslogik schreiben, um alle eindeutigen Spalten-IDs an die foreach-Schleife zu senden.
ps Bevor ich von dieser Kurztransponierungssyntax erfuhr, schrieb ich einen hässlicheren, ausführlicheren funktionalen Transposer, der einige Kritik auf sich zog .