有更好的方法转置PHP二维数组吗?

11
根据PHP手册的说法,使用NULL回调函数调用array_map将导致它执行“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))

然而,这种方法让人感到很不美观和笨拙。

因此我问:
除了自定义实现之外,有没有更好的方法可以在PHP中转置二维数组?

3个回答

4

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

4
不,那是最优雅的方式。

1
如果你真的想避免使用array_merge,可以使用array_unshift将NULL插入到$array_of_arrays数组的开头:
array_unshift($array_of_arrays, NULL);
call_user_func_array('array_map', $array_of_arrays);

当然,它不再是一行代码了 :P


如果我之后想要使用$array_of_arrays,它会改变它,所以我之后必须执行array_shift($array_of_arrays)... - Austin Hyde
@Austin Hyde: 对的。你可以先复制数组:$array_of_arrays = $my_arrays_of_arrays - user102008

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接