Преобразование массивов в PHP

245
22 марта 2017, 18:59

Как в PHP привести массивы такого вида:

$ar1 = array('Магазин 1', 15, 25, 30);
$ar2 = array('Магазин 2', 25, 45, 50);
$ar3 = array('Месяц', 1, 2, 3);

к такому виду:

$values = array(
    array('Месяц', 'Магазин 1', 'Магазин 2'),
    array('1', 15, 25),
    array('2', 25, 45),
    array('3', 30, 50),
);
Answer 1

2 цикла:

function flip($arr) {
    $result = array();
    foreach ($arr as $index => $list) {
        foreach ($list as $key => $value) {
            $result[$key][$index] = $value;
        }
    }
    return $result;
}
$ar1 = array('Магазин 1', 15, 25, 30);
$ar2 = array('Магазин 2', 25, 45, 50);
$ar3 = array('Месяц', 1, 2, 3);
$values = flip([$ar3, $ar1, $ar2]);
var_dump($values);

Демо

Answer 2

добавлю в копилку пару вариантов:

1) Использование функции array_map()

$result = array_map(function($a,$b,$c){ return [$a,$b,$c]; }, $ar3,$ar1,$ar2);

2) Использование функции array_column()

$data = [$ar3, $ar1, $ar2];
$result  = [
            array_column($data,0),
            array_column($data,1),
            array_column($data,2),
            array_column($data,3),
         ];
Answer 3
$ar1 = array('Магазин 1', 15, 25, 30);
$ar2 = array('Магазин 2', 25, 45, 50);
$ar3 = array('Месяц', 1, 2, 3);

$result=array();

//Считаем количество массивов доступных для объединения (тут будет количество + 1. Потом отнимем)
$num=1;
while (isset(${'ar'.$num})) {
    $num++;
}

//Считаем количество элементов в массиве (предполагается, что везде они равны!) В идеале тут нужно проверку перебором всех массивов. Сами допишите).
$cnt=count($ar1);

//Проверка, чтобы всё было ок. По сути данные наши - это матрица
if ($num!=$cnt) {
    exit('Err');
}

$num--; //Получаем точное количество исходных массивов

//Начинаем заполнять итоговый массив
for ($i=1; $i <= $num ; $i++) { 
    foreach (${'ar'.$i} as $key => $value) {
        $result[$key][]=$value;
    }
}

print_r($result);

На выходе будет

Array
(
    [0] => Array
        (
            [0] => Магазин 1
            [1] => Магазин 2
            [2] => Месяц
        )
    [1] => Array
        (
            [0] => 15
            [1] => 25
            [2] => 1
        )
    [2] => Array
        (
            [0] => 25
            [1] => 45
            [2] => 2
        )
    [3] => Array
        (
            [0] => 30
            [1] => 50
            [2] => 3
        )
)

Чтобы получилось так, что в начале месяц, а потом магазин 1 и 2 (без лишних заморочек), рекомендую изменить и порядок нумерации исходных массивов. Если, например, всегда последним массивом месяц, то зная общее количество массивов, проще всего пересоздать переменные, поменяв порядок. Т.е. порядок и нумерация исходных массивов должна быть такая:

$ar1 = array('Месяц', 1, 2, 3);
$ar2 = array('Магазин 1', 15, 25, 30);
$ar3 = array('Магазин 2', 25, 45, 50);

Тогда получите результат, как вы указали (если это 100% критично). Если это нужно, тогда код вот такой

$ar1 = array('Магазин 1', 15, 25, 30);
$ar2 = array('Магазин 2', 25, 45, 50);
$ar3 = array('Месяц', 1, 2, 3);

$result=array();

//Считаем количество массивов доступных для объединения (тут будет количество + 1. Потом отнимем)
$num=1;
while (isset(${'ar'.$num})) {
    $num++;
}

//Считаем количество элементов в массиве (предполагается, что везде они равны!).
$cnt=count($ar1);

//Проверка, чтобы всё было ок. По сути данные наши - это матрица
if ($num!=$cnt) {
    exit('Err');
}

$num--; //Получаем точное количество исходных массивов

//Изменяем нумерацию и порядок исходных массивов
$new_arr1=${'ar'.$num};
for ($i=2; $i <= $num; $i++) { 
    $n=$i-1;
    ${'new_arr'.$i}=${'ar'.$n};
}

//Тут можно удалить старые исходные массивы

//Начинаем заполнять итоговый массив
for ($i=1; $i <= $num ; $i++) { 
    foreach (${'new_arr'.$i} as $key => $value) {
        $result[$key][]=$value;
    }
}
print_r($result);

Старался всё сделать максимально просто и последовательно, не закидывая в кучу.

P.S. " подскажите как можна в PHP". Я думал, что когда есть проверка правописания на лету, то можно уже как-нибудь да грамотно писать. Не могу сам исправить.

READ ALSO
Вывод сложного массива

Вывод сложного массива

Я новичок в phpПодскажите что я делаю не так

189
Выборочное перенаправление

Выборочное перенаправление

Как сделать перенаправление для станиц типа

179
Перестановка в массиве php

Перестановка в массиве php

Есть массив, всего 12 элементов

297
Где скачать libvlc + c++

Где скачать libvlc + c++

Здравствуйте, подскажите можно где скачать библиотеку плеера vlc для разработки под линукс?

271