首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >翻转(转置) 2D数组的行和列,而不改变列数

翻转(转置) 2D数组的行和列,而不改变列数
EN

Stack Overflow用户
提问于 2010-02-08 12:21:10
回答 4查看 26.9K关注 0票数 14

通常,我会问如何转换这样的4行3列数组:

代码语言:javascript
复制
1      2        3
4      5        6
7      8        9
10    11       12

变成一个3行4列的数组,如:(,我不想要这个)

代码语言:javascript
复制
1   4   7   10
2   5   8   11
3   6   9   12

但实际上,我想把它变成这样:(,我想要这个)

代码语言:javascript
复制
1   5   9
2   6   10
3   7   11
4   8   12

换句话说,我想翻转行和列,但是要保持新数组的“宽度”和“高度”。我被困在这上面已经一个多小时了。

这是我用来做普通“翻转”的函数(第一个例子):

代码语言:javascript
复制
function flip($arr)
{
    $out = array();
    foreach ($arr as $key => $subarr)
    {
        foreach ($subarr as $subkey => $subvalue)
        {
            $out[$subkey][$key] = $subvalue;
        }
    }
    return $out;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-08 12:27:30

只需按照正确的顺序遍历数组。假设您有相对较小的数组,最简单的解决方案就是在此过程中创建一个全新的数组。

解决办法将采取以下形式:

代码语言:javascript
复制
$rows = count($arr);
$ridx = 0;
$cidx = 0;

$out = array();

foreach($arr as $rowidx => $row){
    foreach($row as $colidx => $val){
        $out[$ridx][$cidx] = $val;
        $ridx++;
        if($ridx >= $rows){
            $cidx++;
            $ridx = 0;
        }
    }
}
票数 11
EN

Stack Overflow用户

发布于 2013-02-28 08:39:40

代码语言:javascript
复制
function flip_row_col_array($array) {
    $out = array();
    foreach ($array as  $rowkey => $row) {
        foreach($row as $colkey => $col){
            $out[$colkey][$rowkey]=$col;
        }
    }
    return $out;
}
票数 3
EN

Stack Overflow用户

发布于 2020-12-08 10:48:10

首先,你不想要的东西(这是你想要的解决方案的一半).

“翻转行和列”的术语是"transposing“。

自从splat操作符被添加到PHP语言中以来,PHP已经有了一种巧妙的本机技术。

请记住以下几点:

  1. 所有的键必须是数字的。splat/splat运算符将被非数字键阻塞。
  2. 矩阵必须是完整的。如果有任何差距,你可能得不到你想要的结果。

代码:(演示)

代码语言:javascript
复制
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12],
];

var_export(
    array_map(null, ...$matrix)
);

输出:

代码语言:javascript
复制
[
    [1, 4, 7, 10],
    [2, 5, 8, 11],
    [3, 6, 9, 12],
];

现在,为了你想要的!

下面是一个功能类型的片段,它结合了php的转置技术,同时确保输出有与输入相同的列数。

代码:(演示)

代码语言:javascript
复制
var_export(
    array_map(
        null,
        ...array_chunk(
            array_merge(...$matrix),
            count($matrix)
        )
    )
);

输出:

代码语言:javascript
复制
[
    [1, 5, 9],
    [2, 6, 10],
    [3, 7, 11],
    [4, 8, 12],
];

这种方法将输入平平,然后将其分解为长度相当于原始行数的行,然后将结果转置。

后期编辑:作为一个纯粹的学术追求,我想看看一个纯粹的数学技术会是什么样子,它不使用任何条件,也不维护多个“计数器”。

事实证明,由于php数组将把浮点键截断为整数,所以这可以在一个循环中完成。

代码语言:javascript
复制
// assuming the earlier mentioned 3x4 matrix:
i    old pos   new pos  i%rows  i/rows  i/col   i%col  
0  : [0][0] => [0][0]     0      0       0        0
1  : [1][0] => [0][1]     1      0.25    0.3      1
2  : [2][0] => [0][2]     2      0.5     0.6      2
3  : [3][0] => [1][0]     3      0.75    1        0
4  : [0][1] => [1][1]     0      1       1.3      1
5  : [1][1] => [1][2]     1      1.25    1.6      2
6  : [2][1] => [2][0]     2      1.5     2        0
7  : [3][1] => [2][1]     3      1.75    2.3      1
8  : [0][2] => [2][2]     0      2       2.6      2
9  : [1][2] => [3][0]     1      2.25    3        0
10 : [2][2] => [3][1]     2      2.5     3.3      1
11 : [3][2] => [3][2]     3      2.75    3.6      2 

代码:(演示)

代码语言:javascript
复制
$rows = count($matrix);
$cols = count(current($matrix));
$cells = $rows * $cols;

$result = $matrix;  // used to preserve original key orders
for ($i = 0; $i < $cells; ++$i) {
    $result[$i % $rows][$i / $rows] = $matrix[$i / $cols][$i % $cols];
}
var_export($result);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2221476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档