Я использую этот метод для группировки массива исправлений ошибок по дате на панели инструментов Inspector, и я подумал, что это может быть хорошей идеей для фрагмента кода для других. Я также написал реализацию шаблонов блейдов Laravel и более подробную реализацию, поддерживающую фильтрацию.
Я решил реализовать этот код, потому что он позволяет легко прокручивать список элементов на основе их истории.
Эта реализация использует функцию 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')); } }А вот вид клинка:
Благодаря встроенным утилитам, предоставляемым классом Laravel Collection, это действительно просто:
$groupedData = collect($data)->groupBy(function ($item) { return Carbon::parse($item->date)->format('Y-m-d'); });
Вы можете подписаться на меня в Linkedin или X. Я публикую статьи о построении своего SaaS-бизнеса.
Инспектор — это инструмент мониторинга выполнения кода, специально разработанный для разработчиков программного обеспечения. Вам не нужно ничего устанавливать на уровне сервера, просто установите пакет композитора и все готово.
Инспектор очень прост и дружелюбен к PHP. Вы можете попробовать наш пакет Laravel или Symfony.
Если вам нужен HTTP-мониторинг, анализ запросов к базе данных и возможность пересылать оповещения и уведомления в предпочитаемую вами среду обмена сообщениями, попробуйте Inspector бесплатно. Зарегистрируйте свой аккаунт.
Или узнайте больше на сайте: https://inspector.dev
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3