Сортировка массива по дате php

138
18 мая 2019, 11:30

Есть массив формата

     Array
(
  [0] => Array
  (
      [date] => 01.09.2016
      [sum] => 450
  )
    [1] => Array
        (
            [date] => 31.08.2016
            [sum] => 156
        )
    [2] => Array
        (
            [date] => 02.09.2016
            [sum] => 888
        )
        [3] => Array
        (
            [date] => 02.09.2016
            [sum] => 388
        )
        [4] => Array
        (
            [date] => 02.09.2016
            [sum] => 488
        )
        [5] => Array
        (
            [date] => 02.09.2016
            [sum] => 858
        )
        [6] => Array
        (
            [date] => 02.12.2016
            [sum] => 450
        )
)

Как я могу его отсортировать по датам и для каждой даты сделать массив с ключем даты и записать количество заказов в этот день, например для 02.09.2016

[02.09.2016] => Array
            (
                [count] => 4 /*Количество массивов с одинаковой датой***/
            )

И так для всех дат в массиве

Answer 1

Можете сделать так:

    <?php
    $data = array();
    $array = array(
        array(
            'date' => '05.09.2016',
            'sum' => 470,
        ),
        array(
            'date' => '11.11.2016',
            'sum' => 470,
        ),
        array(
            'date' => '05.09.2016',
            'sum' => 100,
        ),
        array(
            'date' => '01.09.2016',
            'sum' => 490,
        ),
        array(
            'date' => '10.10.2016',
            'sum' => 550,
        ),

    );
    foreach ( $array as $row ) {
        $key = $row[ 'date' ];
        $val = $row[ 'sum' ];
        if ( array_key_exists( $key, $data ) ) {
            $data[ $key ] += $val;
        } else {
            $data[ $key ] = $val;
        }

    }
    ksort( $data );
    print_r( $data );
/*
Array
(
    [01.09.2016] => 490
    [05.09.2016] => 570
    [10.10.2016] => 550
    [11.11.2016] => 470
)
*/

Но я бы посоветовал сравнивать даты в UNIX формате, для этого надо не полениться и сделать ещё пару for ))

Answer 2

Если вас интересует только количество заказов, то для этих целей есть функция array_count_values, останется отсортировать результат по ключам, переведя их в даты из строк.

$result = array_count_values(array_column($data, 'date'));
uksort($result, function($a,$b){ return strtotime($a) - strtotime($b);});
print_r($result);

Можно также изначально даты перевести к меткам времени, а потом подсчитать. Тогда достаточно будет обычной сортировки по ключам.

$result = array_count_values(array_map("strtotime", array_column($data, 'date')));
ksort($result);

а метки уже потом преобразовать к виду строковых да при необходимости.

Возможно, если массив получен из БД, вам вообще стоит сделать всю работу на уровне СУБД: select date, count(*) from data order by date ?

READ ALSO
Как передать аттачи через FormData и правильно принять их на php для отправки ф-ей mail()

Как передать аттачи через FormData и правильно принять их на php для отправки ф-ей mail()

Пытаюсь сделать возможность удалять вложения перед отправкой, и потом отправитьРеализацию нашел, но требуется помощь

151
PHP условие по дням недели? как сделать?

PHP условие по дням недели? как сделать?

вот примерно так, но немогу найти решение

114
Вывести документ Excel на сайте

Вывести документ Excel на сайте

Как вывести документ Excel на сайте? Документ имеет большую таблицу

131
Отправить запрос c cURL PUT

Отправить запрос c cURL PUT

Всем приветРебята, прошу Вашей помощи

164