Согласно руководству 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' // ) // )