#php #arrays #multidimensional-array
#php #массивы #многомерный-массив
Вопрос:
У меня есть массив из файла Excel, подобный этому.
$array = [
['parent 1', '10000', '20000'],
['parent 1', '15000', '21000'],
['parent 2', '13000', '22000'],
['parent 2', '11000', '5000'],
];
Как преобразовать массив выше с помощью php в массив, подобный приведенному ниже
$array = [
'parent 1' => [
['10000', '20000'],
['15000', '21000']
],
'parent 2' => [
['13000', '22000'],
['11000', '5000']
]
];
Ответ №1:
Вам нужно выполнить цикл по массиву, чтобы сделать первое значение ключом, а остальные его значения.
Версия 1
$result = [];
foreach ($arr as $k => $v) {
$result[$v[0]][] = [ // making first value as key and reset its values
$v[1], $v[2],
];
}
print_r($result);
Редактировать
Версия 2
$result = [];
foreach ($arr as $k => $v) {
$result[array_shift($v)][] = $v;
}
print_r($result);
Вывод
Array
(
[parent 1] => Array
(
[0] => Array
(
[0] => 10000
[1] => 20000
)
[1] => Array
(
[0] => 15000
[1] => 21000
)
)
[parent 2] => Array
(
[0] => Array
(
[0] => 13000
[1] => 22000
)
[1] => Array
(
[0] => 11000
[1] => 5000
)
)
)
Комментарии:
1. Делать или не делать. Нет «попытки». Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO.
2. Извините, приятель! Я позабочусь об этом в следующий раз. Обновил мой ответ!
3. Я рекомендую использовать
$result[array_shift($v)][] = $v
это общее4. Да, я имел
array_shift
в виду, но не смог сформировать так, как я хочу. Спасибо5. Спасибо, приятель, это то, что я ищу :).
Ответ №2:
Вот такое решение:
Демо-версия: https://3v4l.org/XoivL
$array = [
['parent 1', '10000', '20000'],
['parent 1', '15000', '21000'],
['parent 2', '13000', '22000'],
['parent 2', '11000', '5000'],
];
$new_array = array();
foreach($array as $a) {
$temp = array_slice($a, 1);
if(!array_key_exists($a[0], $new_array)) {
$new_array[$a[0]] = array();
}
array_push($new_array[$a[0]], $temp);
}
print_r($new_array)
ВЫХОДНОЙ СИГНАЛ:
Array
(
[parent 1] => Array
(
[0] => Array
(
[0] => 10000
[1] => 20000
)
[1] => Array
(
[0] => 15000
[1] => 21000
)
)
[parent 2] => Array
(
[0] => Array
(
[0] => 13000
[1] => 22000
)
[1] => Array
(
[0] => 11000
[1] => 5000
)
)
)
Комментарии:
1. Делать или не делать. Нет «попытки». Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO.
2. @JayBlanchard Извините за это! Я обновил свой ответ.
3. Ваше обновление не объясняет, что вы сделали. Представьте, что вам приходится учить нового программиста, что делать. Что бы вы сказали ему / ей?
Ответ №3:
Попробуйте это простое и точное решение.
$array = [
['parent 1', '10000', '20000'],
['parent 1', '15000', '21000'],
['parent 2', '13000', '22000'],
['parent 2', '11000', '5000'],
];
$output = [];
foreach ($array as $key => $value) {
$output[$value[0]][] = array($value[1],$value[2]);
}
print_r($output);
parent 1
И parent 2
лежат в 0
индексе, а другие объекты лежат в индексах 1
and 2
. Я присвоил 1
и 2
индексировал значения для 0
индексации в новом массиве во время каждой итерации
ВЫВОД
Array
(
[parent 1] => Array
(
[0] => Array
(
[0] => 10000
[1] => 20000
)
[1] => Array
(
[0] => 15000
[1] => 21000
)
)
[parent 2] => Array
(
[0] => Array
(
[0] => 13000
[1] => 22000
)
[1] => Array
(
[0] => 11000
[1] => 5000
)
)
)
Вот демонстрация
Комментарии:
1. Делать или не делать. Нет «попытки». Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO.
2. Как это неправильно? не могли бы вы объяснить это подробнее. Спасибо
3. Посмотрите точно на ожидаемый массив, который хочет OP, глубоко остро. Вы получите его, или же сравните с моим выводом и проверьте, есть ли у вас свои недостатки. Но если вы дадите ответ, подобный моему, ваш ответ не будет иметь никакого значения 😉
4. @RahulMeshram Да, вы были правы. Теперь я обновил свой ответ