根据PHP Manual,使用array_map
回调调用NULL
会导致它执行“zip”函数,从给定数组创建并行元素数组。< / p>
例如:
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))
然而,这感觉非常肮脏和笨拙。
所以我问:
除了自定义实现之外,还有更好的方法可以使用PHP转置2D数组吗?
答案 0 :(得分:4)
不。那是最优雅的。
答案 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
答案 2 :(得分:1)
PHP 5.6更新:
我们可以利用PHP 5.6&#34; splat&#34;运算符使参数解包更加清晰:
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'
// )
// )