Транспонирование многомерных массивов в PHP - PullRequest
67 голосов
/ 28 апреля 2009

Как бы вы перевернули 90 градусов (транспонировали) многомерного массива в PHP? Например:

// Start with this array
$foo = array(
    'a' => array(
       1 => 'a1',
       2 => 'a2',
       3 => 'a3' 
    ),
    'b' => array(
       1 => 'b1',
       2 => 'b2',
       3 => 'b3' 
    ),
    'c' => array(
       1 => 'c1',
       2 => 'c2',
       3 => 'c3' 
    )
);

$bar = flipDiagonally($foo); // Mystery function
var_dump($bar[2]);

// Desired output:
array(3) {
  ["a"]=>
  string(2) "a2"
  ["b"]=>
  string(2) "b2"
  ["c"]=>
  string(2) "c2"
}

Как бы вы реализовали flipDiagonally()?

Редактировать: это не домашняя работа. Я просто хочу посмотреть, есть ли у каких-либо SOers более креативное решение, чем самый очевидный путь. Но поскольку несколько человек жаловались на то, что эта проблема слишком проста, как насчет более общего решения, которое работает с массивом измерений n th ?

т.е.. Как бы вы написали функцию так:

$foo[j][k][...][x][y][z] = $bar[z][k][...][x][y][j]

? (Ps. Я не думаю, что 12 вложенных for loops - лучшее решение в этом случае.)

Ответы [ 13 ]

0 голосов
/ 30 июля 2017

Прежде чем начать, я хотел бы сказать еще раз спасибо @quazardus за публикацию его обобщенного решения для транспонирования любого двумерного ассоциативного (или неассоциативного) массива!

Поскольку я имею привычку писать свой код максимально кратко, я продолжил «минимизировать» его код немного дальше. Это будет очень вероятно не на любой вкус. Но на случай, если кому-то будет интересно, вот мое решение:

function arrayMap($cb, array $arrays) // $cb: optional callback function
{   $keys = [];
    array_walk($arrays, function ($array) use (&$keys) 
                        { $keys = array_merge($keys, array_keys($array)); });
    $keys = array_unique($keys); $res = [];
    foreach ($keys as $key) {
      $items = array_map(function ($arr) use ($key)
                         {return isset($arr[$key]) ? $arr[$key] : null; },$arrays);
      $res[$key] = call_user_func(
        is_callable($cb) ? $cb 
                         : function($k, $itms){return $itms;},
        $key, $items);
    }
    return $res;
}

Теперь аналогично стандартной функции PHP array_map(), когда вы вызываете

arrayMap(null,$b);

вы получите нужную транспонированную матрицу.

0 голосов
/ 17 июня 2017
<?php

$tableau_init = [
    [
        "prenom" => "med",
        "age" => 1
    ],
    [
        "prenom" => "hassan",
        "age" => 2
    ],
    [
        "prenom" => "ali",
        "age" => 3
    ]
];

function transpose($tableau){
    $out = array();

    foreach ($tableau as $key => $value){
        foreach ($value as $subKey => $subValue){
            $out[$subKey][$key] = $subValue;
        }
    }

    echo json_encode($out);
}

transpose($tableau_init);

Попробуйте как это

0 голосов
/ 30 июня 2016

Используйте вот так

<?php
$foo = array(
    'a' => array(
       1 => 'a1',
       2 => 'a2',
       3 => 'a3' 
    ),
    'b' => array(
       1 => 'b1',
       2 => 'b2',
       3 => 'b3' 
    ),
    'c' => array(
       1 => 'c1',
       2 => 'c2',
       3 => 'c3' 
    )
);

echo "<pre>"; 

 $i=0;
 foreach ($foo as $val)
   { $i++;
       $array[$i] = array_column($foo, $i);    

   }
   print_r($array);

?>

Результат:

Array
(
    [1] => Array
        (
            [0] => a1
            [1] => b1
            [2] => c1
        )

    [2] => Array
        (
            [0] => a2
            [1] => b2
            [2] => c2
        )

    [3] => Array
        (
            [0] => a3
            [1] => b3
            [2] => c3
        )

)
...