使用php创建转置矩阵

Ahm*_*adi 7 php arrays matrix

例如,如果矩阵是:

1 2
3 4
5 6
Run Code Online (Sandbox Code Playgroud)

然后转置上面的矩阵将是:

1 3 5
2 4 6
Run Code Online (Sandbox Code Playgroud)

这是我目前的代码:

<?php

    // transpose matrix
    $trans = array(
        array(1, 2),
        array(3, 4),
        array(5, 6)
    );

    foreach ($trans as $key => $val){
        foreach ($trans[$key] as $k => $v){
            echo $v;
        }
    }

?>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ker 17

有一种奇怪的PHP方式来转置2d数组:

$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);
Run Code Online (Sandbox Code Playgroud)

演示

使用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);
Run Code Online (Sandbox Code Playgroud)

编辑说明

从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]);
Run Code Online (Sandbox Code Playgroud)

对于您的示例数组,因为2-d数组的顶级有三个元素(键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[];
}
Run Code Online (Sandbox Code Playgroud)

那里有几个额外的支票

  • 它不关心你的数组是否在任何维度中是关联的或枚举的,因为它访问$ith元素而不是索引
  • 如果子数组的长度不是全部相同,那么它会有效地填充较短的子数组,使其具有空值以匹配最长的子数据
  • 传入的数组数量无关紧要,它们可以并行使用它们