有一种奇怪的 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);
Demo
EDIT使用 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);
EDIT解释
引用自 PHP 文档array_map() 函数:
该函数的一个有趣的用途是构造一个数组的数组,可以通过使用 NULL 作为回调函数的名称来轻松执行此操作
(有关其作用的示例,请参阅该文档页面中的示例 #4)
The 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
第一个元素,而不是索引
- 如果子数组的长度不一样,那么它会有效地用空值填充较短的子数组,以匹配最长的子数组的长度
- 无论您传入多少个数组,它都会并行处理它们