Есть ли лучший способ транспонировать массив 2D 2D?

В соответствии с PHP Manual вызов array_map с обратным вызовом NULL заставляет его выполнять функцию "zip", создавая массив массивов параллельных элементов из заданных массивов.

Например:

array_map(NULL,array(1,2,3),array('a','b','c'));

дает

array(array(1,'a'),array(2,'b'),array(3,'c'))

Это также эквивалентно транспонированию массива

array(array(1,2,3),array('a','b','c'))

Прямо сейчас, кажется, что это самый близкий путь (используя встроенные функции), вы можете транспонировать массив, за исключением того, что array_map принимает список массивов, а не массив массивов.

В некотором коде, над которым я работаю, мне нужно перенести массив массивов, а не список массивов, поэтому я сделал эту работу:

call_user_func_array('array_map',array_merge(array(NULL),$array_of_arrays))

Однако это кажется очень грязным и неуклюжим.

И поэтому я спрашиваю:
Есть ли лучший способ перенести 2D-массив с PHP, помимо специальной реализации?

Ответ 1

Неа. Это самый элегантный.

Ответ 2

Если вы действительно хотите избежать array_merge, используйте array_unshift, чтобы вместо NULL добавить к $array_of_arrays:

array_unshift($array_of_arrays, NULL);
call_user_func_array('array_map', $array_of_arrays);

Конечно, это не однострочный шрифт: P

Ответ 3

Обновление для PHP 5.6:

Мы можем воспользоваться оператором PHP 5.6 "splat", чтобы сделать эту операцию много, гораздо более чистой с распаковкой аргументов:

array_map(null, ...$array_of_arrays);

Например:

[1] boris> $arr2d = [ [1,2,3], ['a','b','c'] ];
// array(
//   0 => array(
//     0 => 1,
//     1 => 2,
//     2 => 3
//   ),
//   1 => array(
//     0 => 'a',
//     1 => 'b',
//     2 => 'c'
//   )
// )
[2] boris> array_map(null, ...$arr2d);
// array(
//   0 => array(
//     0 => 1,
//     1 => 'a'
//   ),
//   1 => array(
//     0 => 2,
//     1 => 'b'
//   ),
//   2 => array(
//     0 => 3,
//     1 => 'c'
//   )
// )