12

通常、4 行 3 列の配列を次のように変換する方法を尋ねます。

1      2        3
4      5        6
7      8        9
10    11       12

次のような 3 行 4 列の配列に: ( I DON'T WANT THIS )

1   4   7   10
2   5   8   11
3   6   9   12

しかし、実際には、これに変えたい: ( I WANT THIS )

1   5   9
2   6   10
3   7   11
4   8   12

つまり、行と列を反転させたいのですが、新しい配列の「幅」と「高さ」は同じに保ちます。私はこれに1時間以上立ち往生しています。

これは、通常の「反転」を行うために使用している関数です (最初の例)。

function flip($arr)
{
    $out = array();
    foreach ($arr as $key => $subarr)
    {
        foreach ($subarr as $subkey => $subvalue)
        {
            $out[$subkey][$key] = $subvalue;
        }
    }
    return $out;
}
4

4 に答える 4

11

配列を正しい順序で歩くだけです。アレイが比較的小さいと仮定すると、最も簡単な解決策は、そのウォーク中にまったく新しいアレイを作成することです。

ソリューションは次の形式になります。

$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;
        }
    }
}
于 2010-02-08T12:27:30.973 に答える
3
function flip_row_col_array($array) {
    $out = array();
    foreach ($array as  $rowkey => $row) {
        foreach($row as $colkey => $col){
            $out[$colkey][$rowkey]=$col;
        }
    }
    return $out;
}
于 2013-02-28T08:39:40.680 に答える
0

どうぞ。できます。:)

デモンストレーション

$input = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12],
];

// flipping matrices
$output = array();
$intern = array();

for($row=0; $row < 4; $row++)
    for($col=0;$col < 3;$col++)
        $intern[] = $input[$row][$col];
    
// nesting the array
$count = 0;
$subcount = 0;

foreach($intern as $value)
{

    $output[$count][$subcount] = $value;
    $count++;

    if($subcount == 3)
    {
        break;
    }

    if($count == 4)
    {
        $count = 0;
        $subcount++;
    }
}


echo "\n final output ";print_r($output);
于 2010-02-08T13:35:35.283 に答える