«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как сгруппировать массив по дате в PHP – быстрые советы

Как сгруппировать массив по дате в PHP – быстрые советы

Опубликовано 3 ноября 2024 г.
Просматривать:301

Я использую этот метод для группировки массива исправлений ошибок по дате на панели инструментов Inspector, и я подумал, что это может быть хорошей идеей для фрагмента кода для других. Я также написал реализацию шаблонов блейдов Laravel и более подробную реализацию, поддерживающую фильтрацию.

Я решил реализовать этот код, потому что он позволяет легко прокручивать список элементов на основе их истории.

Группировать массив по дате на чистом PHP

Эта реализация использует функцию array_reduce. Это позволяет постепенно создавать новый массив, где каждая дата становится ключом, а его значением является соответствующий элемент.

$data = [
    ['date' => '2023-06-01', 'value' => 10],
    ['date' => '2023-06-02', 'value' => 20],
    ['date' => '2023-06-01', 'value' => 30],
    ['date' => '2023-06-03', 'value' => 40],
    ['date' => '2023-06-02', 'value' => 50],
];

$groupedData = array_reduce($data, function ($result, $item) {
    $date = new DateTime($item['date']);
    $formattedDate = $date->format('Y-m-d');

    if (!isset($result[$formattedDate])) {
        $result[$formattedDate] = [];
    }

    $result[$formattedDate][] = $item;

    return $result;
}, []); // 



Благодаря объекту DateTime и методу формата вы можете настроить логику группировки по месяцам или годам, просто изменив строку формата: «Г-м» для месяца или «Г» для года.

Фильтрация и группировка

Вы также можете добавить функцию фильтра для фильтрации элементов перед их группировкой по полю даты.

$groupedData = array_reduce(array_filter($data, function ($item) use ($filter) {
        // Filter condition: keep elements with value greater than 20
        return $item['value'] > $filter;
    }), 
    function ($result, $item) {
        $date = new DateTime($item['date']);
        $formattedDate = $date->format('Y-m-d');

        if (!isset($result[$formattedDate])) {
            $result[$formattedDate] = [];
        }

        $result[$formattedDate][] = $item;

        return $result;
    }, []);

Внутри функции обратного вызова array_filter() мы указываем условие фильтра. В этом примере мы сохраняем только те элементы, у которых поле «значение» больше, чем $filter. Вы можете изменить это условие в зависимости от вашего конкретного варианта использования.

Отображение результатов в пользовательском интерфейсе с помощью лезвия Laravel

Очевидно, вы можете вдохновиться и использовать ту же стратегию в своей конкретной технологии (например, Symfony Twig или аналогичной).

Чтобы операторы манипулирования данными были отделены от представления, я держу процесс фильтрации и группировки на уровне контроллера и реализую только итерацию структуры данных на стороне шаблона.

Вот контроллер:

namespace App\Http;


use Illuminate\Http\Request;


class DashboardController extends Controller
{
    /**
     * The dashboard.
     *
     * @param ImpersonatesUsers $impersonator
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index(Request $request)
    {
        $data = $this->getData();

        $data = array_reduce(array_filter($data, function ($item) use ($filter) {
            // Filter condition: keep elements with value greater than 20
            return $item['value'] > $filter;
        }), 
        function ($result, $item) {
            $date = new DateTime($item['date']);
            $formattedDate = $date->format('Y-m-d');

            if (!isset($result[$formattedDate])) {
                $result[$formattedDate] = [];
            }

            $result[$formattedDate][] = $item;

            return $result;
        }, []);

        return view('dashboard', compact('data'));
    }
}

А вот вид клинка:

    @foreach ($groupedData as $date => $items)
  • {{ $date }}
      @foreach ($items as $item)
    • Value: {{ $item['value'] }}
    • @endforeach
  • @endforeach

Группировка коллекции Laravel по дате

Благодаря встроенным утилитам, предоставляемым классом Laravel Collection, это действительно просто:

$groupedData = collect($data)->groupBy(function ($item) {
    return Carbon::parse($item->date)->format('Y-m-d');
});

Вы можете подписаться на меня в Linkedin или X. Я публикую статьи о построении своего SaaS-бизнеса.

Контролируйте свое PHP-приложение бесплатно

Инспектор — это инструмент мониторинга выполнения кода, специально разработанный для разработчиков программного обеспечения. Вам не нужно ничего устанавливать на уровне сервера, просто установите пакет композитора и все готово.

Инспектор очень прост и дружелюбен к PHP. Вы можете попробовать наш пакет Laravel или Symfony.

Если вам нужен HTTP-мониторинг, анализ запросов к базе данных и возможность пересылать оповещения и уведомления в предпочитаемую вами среду обмена сообщениями, попробуйте Inspector бесплатно. Зарегистрируйте свой аккаунт.

Или узнайте больше на сайте: https://inspector.dev

How to group array by date in PHP – Fast Tips

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/inspector/how-to-group-array-by-date-in-php-fast-tips-4oc0?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3