Ответ 1
Неа. Это самый элегантный.
В соответствии с 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, помимо специальной реализации?
Неа. Это самый элегантный.
Если вы действительно хотите избежать 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:
Мы можем воспользоваться оператором 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'
// )
// )