Search code examples
phparraysmultidimensional-arraytranspose

Flip (transpose) the rows and columns of a 2D array without changing the number of columns


Normally, I'd be asking how to turn a 4-rowed, 3-columned array like this:

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

Into a 3-rowed, 4-columned array like: (I DON'T WANT THIS)

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

But actually, I want to turn it into this: (I WANT THIS)

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

In other words, I want to flip the rows and columns, but keep the same "width" and "height" of the new array. I've been stuck on this for over an hour.

This is the function I'm using to do a normal "flip" (the first example):

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

Solution

  • Just walk the array in the correct order. Assuming you have relatively small arrays, the easiest solution is just to create a brand new array during that walk.

    A solution will be of the form:

    $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;
            }
        }
    }