PHP - 如何翻转2D数组的行和列

Gnu*_*fo1 9 php arrays multidimensional-array

通常我会问如何变成这样的东西:

1      2        3
4      5        6
7      8        9
10    11       12
Run Code Online (Sandbox Code Playgroud)

进入:

1   4   7   10
2   5   8   11
3   6   9   12
Run Code Online (Sandbox Code Playgroud)

但实际上我想把它变成这个:

1   5   9
2   6   10
3   7   11
4   8   12
Run Code Online (Sandbox Code Playgroud)

换句话说,我想翻转行和列,但保持新数组的"宽度"和"高度"相同.我已经坚持了一个多小时.

这是我用来做普通"翻转"的功能(第一个例子):

function flip($arr)
{
    $out = array();

    foreach ($arr as $key => $subarr)
    {
            foreach ($subarr as $subkey => $subvalue)
            {
                 $out[$subkey][$key] = $subvalue;
            }
    }

    return $out;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*iot 10

只需按正确顺序走数组即可.假设您有相对较小的阵列,最简单的解决方案就是在该步行期间创建一个全新的阵列.

解决方案将采用以下形式:

$rows = count($arr);
$cols = count($arr[0]); // assumes non empty matrix
$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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


che*_*hal 6

function flip_row_col_array($array) {
    $out = array();
    foreach ($array as  $rowkey => $row) {
        foreach($row as $colkey => $col){
            $out[$colkey][$rowkey]=$col;
        }
    }
    return $out;
}
Run Code Online (Sandbox Code Playgroud)