你或许有过这样的需求,将这样的二维数组 $x
1 2 3 4 5
1 2 3 4 5
转换成这样的结果 $y
1 1
2 2
3 3
4 4
5 6
一个便捷的方式是使用array_map函数
array_map ( callable $callback , array $array1 [, array $... ] ) : array
array_map — 为数组的每个元素应用回调函数
如果传入多个一维数组,那么这些一维数组的元素个数应该相等,如果不相等会被自动填充空。
然后,这些一维数组在同一列上的元素会被同时取出作为 callback 的参数,类似于这样:
function($1n, $2n, $3n, ...) // n 表示列的编号
这是关键的原理,看文档解释:
传入两个及以上的数组时,它们元素数量将会相同。因为回调函数会并行地处理相互对应的元素。 如果几个数组的元素数量不一致:空元素会扩展短那个数组,直到长度和最长的数组一样。
此函数有个有趣的用法:传入 NULL 作为回调函数的名称,将创建多维数组(一个数组,内部包含数组。)
示例:
$a = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");
$d = array_map(null, $a, $b, $c);
print_r($d);
打印信息
Array
(
[0] => Array
(
[0] => 1
[1] => one
[2] => uno
)
[1] => Array
(
[0] => 2
[1] => two
[2] => dos
)
[2] => Array
(
[0] => 3
[1] => three
[2] => tres
)
[3] => Array
(
[0] => 4
[1] => four
[2] => cuatro
)
[4] => Array
(
[0] => 5
[1] => five
[2] => cinco
)
)
为什么会这样呢,实际上当你传入null作为回调函数的时候,就会使用默认的回调函数,而默认的回调就是直接将结果返回。
function(...$t){
return $t;
}
你把这个函数代替null,将会得到同样的结果。
所以,解决方案为:
$y = array_map(null, ...$x);
或者
array_unshift($x, null);
$y = call_user_func_array("array_map", $x);