例如,如果矩阵是:
1 2
3 4
5 6
然后转换上面的矩阵将是:
1 3 5
2 4 6
这是我目前的代码:
<?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;
}
}
?>
答案 0 :(得分:16)
有一种奇怪的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);
编辑使用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文档这个函数的一个有趣用途是构造一个数组数组,通过使用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]);
表示您的示例数组,因为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[];
}
那里有几个额外的支票
$i
元素,而不是索引答案 1 :(得分:0)
我相信这也适用于矩形阵列。
技巧:return array_map(null, ...$squareArray);
似乎以一种意想不到的方式为单个列数组
function RotateSquare2DArray($squareArray)
{
if ($squareArray == null) { return null; }
$rotatedArray = array();
$r = 0;
foreach($squareArray as $row) {
$c = 0;
if (is_array($row)) {
foreach($row as $cell) {
$rotatedArray[$c][$r] = $cell;
++$c;
}
}
else $rotatedArray[$c][$r] = $row;
++$r;
}
return $rotatedArray;
}
如果数组是关联的,我使用这个
function RotateSquareAssociativeArray($squareArray)
{
if ($squareArray == null) { return null; }
$rotatedArray = array();
$r = 0;
foreach($squareArray as $c=>$row) {
if (is_array($row)) {
foreach($row as $key=>$cell) {
$rotatedArray[$key][$c] = $cell;
}
}
else {
$rotatedArray[$c][$r] = $row;
}
++$r;
}
return $rotatedArray;
}