Web

Объединение или слияние массива на основе значений

У меня есть массив, который дает мне дату доставки заказа и массив того, какие элементы были в этом заказе.

(

[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

Преобразование форматов даты в PHP

Web

Как выполнить усечение строки до первых n символов и добавить три точки в конце

Web

Заменить уведомление о невыполнении заказа на количество невыполненных заказов для каждого элемента корзины на странице WooCommerce

Web

Извлечение данных из JSON с помощью PHP