Как реструктурировать многомерный массив со столбцами в виде строк?

Есть ли эффективный способ изменить структуру этого многомерного массива? Я хочу сгруппировать значения столбца.

//$arrayBefore
[[5, 4, 10], [11, 13, 15], [32, 14, 15]];

Желаемый результат:

//$arrayAfter
[[5, 11, 32], [4, 13, 14], [10, 15, 15]]; 

4 ответа

Решение

Вы можете сделать это на основе array_column ():-

<?php

$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];

$final_array = [array_column($array,0),array_column($array,1),array_column($array,2)];

print_r($final_array );

Вывод:- https://eval.in/836310

Примечание:- приведенный выше код будет работать только для этого массива.

Более общий и учитывая все аспекты использования кода foreach() :-

<?php
$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];

$final_array = array();

foreach($array as $arr){
    foreach($arr as $key=>$value){
      $final_array[$key][]=$value;
    }
}
print_r($final_array);

Вывод:- https://eval.in/836313

<?php

$array = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];

for($i = 0; $i < count($array); $i++) {
    for ($j = 0; $j < count($array[$i]); $j++) {
        $temp[$j][] = $array[$i][$j];
    }
}
print_r($temp);

ВЫХОД: http://www.phpwin.org/s/BVxAx3

Если вы не уверены в структуре массива, вы также можете использовать foreach. Будет работать более 3 в каждом массиве без какой-либо модификации кода

<?
$arr = [[5, 4, 10], [11, 13, 15], [32, 14, 15]];

foreach($arr as $value_arr){
    $i=0;
    foreach($value_arr as $value){
        if ($value){
            $arr2[$i][]=$value;
            $i++;
        }
    }

}

echo "<pre>";
print_r($arr2);
echo "</pre>";
?>

Array
(
    [0] => Array
        (
            [0] => 5
            [1] => 11
            [2] => 32
        )

    [1] => Array
        (
            [0] => 4
            [1] => 13
            [2] => 14
        )

    [2] => Array
        (
            [0] => 10
            [1] => 15
            [2] => 15
        )

)

Я уже издевался над SO, чтобы продвигать вариадный подход для такого рода вопросов, но я думаю, что важно показать, что умные разработчики php предоставили программистам делать.

... (оператор сплат) говорит array_map() что многомерный (с потенциально переменным числом подмассивов) массив прибывает. Затем функция синхронно повторяет каждый отдельный подмассив.

В следующем коде я закомментировал метод, который статически называет аргументы $v1, $v2, $v3 использован array_map(), Это будет работать для случая ОП.

Строка кода, следующая за прокомментированной, представляет собой метод, который динамически обращается к значениям без необходимости именования переменных. Это также будет чрезвычайно гибким для любого случая, когда структура многомерного массива меняет свой размер / форму.

Справочные руководства по PHP:

Однострочник (требуется PHP5.6 +): ( Демонстрация с дополнительными примерами / соображениями)

$m_array=[[5, 4, 10], [11, 13, 15], [32, 14, 15]];
//$new=array_map(function($v1,$v2,$v3){return [$v1,$v2,$v3];},...$m_array);
$new=array_map(function(){return func_get_args();},...$m_array);
var_export($new);

Выход:

array (
  0 => 
  array (
    0 => 5,
    1 => 11,
    2 => 32,
  ),
  1 => 
  array (
    0 => 4,
    1 => 13,
    2 => 14,
  ),
  2 => 
  array (
    0 => 10,
    1 => 15,
    2 => 15,
  ),
)
Другие вопросы по тегам