Якщо ви спробуєте розпакувати зразкові дані OP за допомогою оператора splat ( ...
), ви згенеруєте:
Фатальна помилка: Помилка невпійманого: Не вдається розпакувати масив за допомогою рядкових ключів
Доказ
Щоб подолати цю помилку, зателефонуйте array_values()
до індексації ключів першого рівня перед розпаковуванням.
var_export(array_map(null, ...array_values($foo)));
Вихід:
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',
),
)
Додатковою особливістю / сюрпризом щодо транспонування за допомогою цієї техніки є те null
елементи будуть генеруватися, коли підмасиви мають різний розмір ... але, можливо, не там, де можна очікувати.
З таких зразків даних:
$foo = array(
'a' => array(
1 => 'a1',
2 => 'a2'
),
'b' => array(
1 => 'b1',
3 => 'b3'
),
'c' => array(
1 => 'c1',
2 => 'c2',
3 => 'c3'
)
);
Результат:
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',
),
)
Зверніть увагу на рівень обережності, який виявляє функція (порівняно з обробниками багажу, які виймають ваш багаж із живота). Там немає жодної уваги до ідентифікаторів вихідних значень подмассіва (і це не мало б значення , якщо 1
, 2
, і 3
були x
, y
, &z
); все, що зійде з конвеєрної стрічки, потрапляє в найнижчий доступний слот
Така поведінка є послідовною та надійною у забезпеченні повної матриці. foreach()
Альтернативний цикл не буде спочатку поставити null
елемент з подмассивов різних розмірів, а також в більшості реалізацій його здатність отримати доступ до всіх подмассів значення залежить від довжини першої підґратки.
$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);
Вихід:
array (
0 =>
array (
0 => 'a1',
1 => 'b1',
2 => 'c1',
),
1 =>
array (
0 => 'a2',
1 => 'c2',
),
)
Як показано вище, якщо ви хочете бути впевненими, що ви вилучили ВСІ дані із вхідного масиву, вам доведеться написати логіку додавання, щоб доставити всі унікальні ідентифікатори стовпців у цикл foreach.
ps, перш ніж я дізнався про цей стенографічний синтаксис транспонування, я написав потворніший, багатослівніший функціональний транспонсер, який спричинив деяку критику .