PHP - 2D bir dizinin satır ve sütunları çevirmek nasıl

4 Cevap php

Normalde böyle bir şey nasıl açacağınızı soran olurdu:

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

Bu içine:

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

Ama aslında ben bu haline çevirmek istiyorum:

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

Diğer bir deyişle, ben satırlar ve sütunlar çevirmek, ama aynı "genişliği" ve yeni dizinin "yükseklik" tutmak istiyorum. Ben bir saatten fazla bu sıkışmış oldum.

Bu normal bir "flip" (ilk örnek) yapmak için kullanıyorum fonksiyonudur:

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

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

    return $out;
}

4 Cevap

Sadece doğru sırayla dizi yürüyün. Eğer nispeten küçük diziler var varsayarsak, en kolay çözüm sadece bu yürüyüş sırasında bir marka yeni bir dizi oluşturmaktır.

Bir çözelti şeklinde olacaktır:

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

Buraya gitmek. Bu çalışıyor. :)



$input1 = array(1,2,3);
$input2 = array(4,5,6);
$input3 = array(7,8,9);
$input4 = array(10,11,12);

$input = array($input1,$input2,$input3,$input4);

echo "\n input array";print_r($input);

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

for($row=0; $row lt 4; $row++)
    for($col=0;$col lt 3;$col++)
        $intern[] = $input[$row][$col];

echo "\n intern ";print_r($intern);

// 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);

Kısmen çok boyutlu diziler düzleştirmek için burada bulunan bir çözümde, bu kod geliştirdik.

Umarım yardımcı olur!

/**
 *
 * http://stackoverflow.com/questions/2289475/converting-php-array-of-arrays-into-single-array
 * @param array $array
 * @return array
 */
function arrayFlatten(array $array)
{
    $flatten = array();
    array_walk_recursive($array, function($value) use(&$flatten)
    {
        $flatten[] = $value;
    });

    return $flatten;
}

/**
 *
 *  Reorders an array to put the results ordered as a "N", instead of a "Z"  
 *
 * @static
 * @param $array Array to be ordered
 * @param $columns Number of columns of the "N"
 * @return void
 */
function ZOrderToNOrder($array, $columns)
{
    $maxRows = ceil(count($array) / $columns);
    $newArray = array();
    $colCounter = 0;
    $rowCounter = 0;
    foreach ($array as $element)
    {
        $newArray[$rowCounter][] = $element;
        $rowCounter++;
        if ($rowCounter == $maxRows)
        {
            $colCounter++;
            $rowCounter = 0;
        }
    }

    return arrayFlatten($newArray);
}

Bir veya daha fazla sütun bir daha eleman var zaman falvarez, ZOrderToNOrder işlevi düzgün çalışmıyor diğer sütunlar (diğer> 1).

ben bu kod bunu düzeltmek düşünüyorum:

public static function ZOrderToNOrder($array, $columns) {
    $numElements = count($array);

    $maxRows = array();
    for ($i = 0; $i < $columns; $i++) {
        $maxRows[$i] = intval(ceil(($numElements - $i) / $columns));
    }

    $newArray = array();

    $rowCounter = 0;
    $colCounter = 0;
    foreach ($array as $element) {
        $newArray[$rowCounter][$colCounter] = $element;
        $rowCounter++;
        if ($rowCounter === $maxRows[$colCounter]) {
            $rowCounter = 0;
            $colCounter++;
        }
    }

    return self::arrayFlatten($newArray);
}

Selamlar,

Armando