У меня есть массив, который дает мне дату доставки заказа и массив того, какие элементы были в этом заказе.
(
[0] => Array (
[0] => 14 May, 2021
[1] => Array ([0] => Упаковка пирожных)
)
[1] => Array (
[0] => 14 May, 2021
[1] => Array ([0] => Пирожные с печеньем и кремом )
)
[2] => Array (
[0] => 14 May, 2021
[1] => Array ([0] => Упаковка пирожных )
)
[3] => Array (
[0] => 29 May, 2021
[1] => Array ([0] => Упаковка пирожных )
)
[4] => Array (
[0] => 13 May, 2021
[1] => Array ([0] => Упаковка пирожных )
)
[5] => Array (
[0] => 13 May, 2021
[1] => Array ([0] => Упаковка пирожных )
)
[6] => Array (
[0] => 14 May, 2021
[1] => Array ([0] => Упаковка пирожных )
)
)
Мне нужно объединить их, чтобы в итоге мы получили массив, похожий на этот:
[0] => Array (
[0] => 14 May, 2021
[1] => Array (
[0] => 3 x Упаковка пирожных
[1] => 1 x Пирожные с печеньем и кремом
)
)
[1] => Array (
[0] => 29 May, 2021
[1] => Array ( [0] => 1 x Упаковка пирожных )
)
[2] => Array (
[0] => 13 May, 2021
[1] => Array ( [0] => 2 x Упаковка пирожных )
)
Таким образом, надо собрать все элементы, которые были доставлены в определенный день. Надеюсь, это понятно. План состоит в том, чтобы создать представление календаря, чтобы мой клиент мог с первого взгляда увидеть, сколько товаров должно быть доставлено в определенный день.
Я просто не могу понять, как объединить/слить/соединить эти массивы. У меня есть несколько идей, но я думаю, что они могут оказаться довольно сложными, а у кого-то наверняка есть хорошие методы, как это сделать.
Ответ 1
Что-то вроде этого сделает то, о чем вы просите:
<?php
$input = [
[ "14 May, 2021", [ "Упаковка пирожных" ] ],
[ "14 May, 2021", [ "Пирожные с печеньем и кремом" ] ],
[ "14 May, 2021", [ "Упаковка пирожных" ] ],
[ "29 May, 2021", [ "Упаковка пирожных" ] ],
[ "13 May, 2021", [ "Упаковка пирожных" ] ],
[ "13 May, 2021", [ "Упаковка пирожных" ] ],
[ "14 May, 2021", [ "Упаковка пирожных" ] ]
];
$output = [];
array_walk($input, function($order) use (&$output) {
$date = $order[0];
$items = $order[1];
if (!array_key_exists($date, $output)) {
$output[$date] = [];
}
foreach ($items as $item) {
if (array_key_exists($item, $output[$date])) {
$output[$date][$item] += 1;
} else {
$output[$date][$item] = 1;
}
}
});
print_r($output);
Вывод очевиден:
Array
(
[14 May, 2021] => Array (
[Упаковка пирожных] => 3
[Пирожные с печеньем и кремом] => 1
)
[29 May, 2021] => Array (
[Упаковка пирожных] => 1
)
[13 May, 2021] => Array (
[Упаковка пирожных] => 2
)
)
Для вашего случая:
<?php
$input = [
[ "14 May, 2021", [ "Упаковка пирожных" ] ],
[ "14 May, 2021", [ "Пирожные с печеньем и кремом" ] ],
[ "14 May, 2021", [ "Упаковка пирожных" ] ],
[ "29 May, 2021", [ "Упаковка пирожных" ] ],
[ "13 May, 2021", [ "Упаковка пирожных" ] ],
[ "13 May, 2021", [ "Упаковка пирожных" ] ],
[ "14 May, 2021", [ "Упаковка пирожных" ] ]
];
$output = [];
array_walk($input, function($order) use (&$output) {
$date = $order[0];
$items = $order[1];
if (!array_key_exists($date, $output)) {
$output[$date] = [$date, []];
}
foreach ($items as $item) {
if (array_key_exists($item, $output[$date][1])) {
$output[$date][1][$item] += 1;
} else {
$output[$date][1][$item] = 1;
}
}
});
$output = array_values($output);
print_r($output);
И вывод:
Array (
[0] => Array (
[0] => 14 May, 2021
[1] => Array (
[Упаковка пирожных] => 3
[Пирожные с печеньем и кремом] => 1
)
)
[1] => Array (
[0] => 29 May, 2021
[1] => Array ( [Упаковка пирожных] => 1)
)
[2] => Array (
[0] => 13 May, 2021
[1] => Array ( [Упаковка пирожных] => 2)
)
)
Web