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

Согласно руководству PHP , вызов array_map с 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, помимо специальной реализации?

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

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

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

Конечно, это уже не один лайнер: P

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

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

 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' // ) // )