有一种古怪的 PHP 方法可以转置二维数组:
$trans = array(
array(1, 2),
array(3, 4),
array(5, 6)
);
array_unshift($trans, null);
$trans = call_user_func_array('array_map', $trans);
var_dump($trans);
演示
编辑 使用 PHP 5.6 数组展开更简单的方法
随着在 PHP 5.6 中引入数组参数展开功能,我们可以进一步简化这个过程:
$trans = array(
array(1, 2),
array(3, 4),
array(5, 6)
);
$trans = array_map(null, ...$trans);
var_dump($trans);
编辑 说明
引用来自PHP array_map() 函数的文档:
这个函数的有趣用法是构建一个数组的数组,可以通过使用 NULL 作为回调函数的名称轻松完成
(查看该文档页面的示例 #4,了解此操作的示例)
我们首先执行的 array_unshift($trans, null)
提供了那个 NULL 回调,我们使用 call_user_func_array()
,因为我们不一定知道 $trans
数组中有多少个值。我们使用 call_user_func_array()
所做的相当于:
$trans = array_map(NULL, $trans[0], $trans[1], $trans[2]);
对于您的示例数组,因为您的二维数组顶层有三个元素(键0、1和2)。
实际上,这个NULL回调将并行遍历所有数组,依次从它们中取出每个值以构建一个新数组:
$maxArraySize = max(count($array[0], $array[1], $array[2]);
// $maxArraySize will have a value of 2 in your case,
// because your sub-arrays are all equal size
$newArray = [];
for($i = 0; $i < $maxArraySize; ++$i) {
$tmpArray = [];
$tmpArray[] = $array[0][$i];
$tmpArray[] = $array[1][$i];
$tmpArray[] = $array[2][$i];
$newArray[] = $tmpArray[];
}
这里有一些额外的检查
- 它不在乎你的数组是关联数组还是枚举数组,因为它访问的是第
$i
个元素,而不是索引
- 如果子数组的长度不相等,则会用null值填充较短的子数组,使其与最长子数组的长度相同
- 无论传入多少个数组,它都会并行处理它们