我使用这种技术在检查器仪表板中按日期对错误修复数组进行分组,我认为这对其他人来说可能是一个很好的代码片段想法。我还编写了 Laravel Blade 模板的实现以及支持过滤的更详细的实现。
我决定实现此代码,因为它使项目列表可以根据其历史记录轻松滚动。
此实现使用 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; }, []); // <-- Start with an empty array
借助 DateTime 对象和 format 方法,您只需更改格式字符串即可按月或年自定义分组逻辑:'Y-m' 表示月份,或 'Y' 表示年份。
您还可以引入过滤函数来过滤元素,然后再按日期字段对元素进行分组。
$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()的回调函数中,我们指定过滤条件。在此示例中,我们仅保留“value”字段大于 $filter 的元素。您可以根据您的具体用例修改此条件。
显然,您可以汲取灵感并在您的特定技术中使用相同的策略(例如 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')); } }
这是刀片视图:
<ul> @foreach ($groupedData as $date => $items) <li> <strong>{{ $date }}</strong> <ul> @foreach ($items as $item) <li>Value: {{ $item['value'] }}</li> @endforeach </ul> </li> @endforeach </ul>
感谢 Laravel Collection 类提供的内置实用程序,它非常简单:
$groupedData = collect($data)->groupBy(function ($item) { return Carbon::parse($item->date)->format('Y-m-d'); });
您可以在 Linkedin 或 X 上关注我。我发布了有关建立我的 SaaS 业务的文章。
Inspector是一款专为软件开发人员设计的代码执行监控工具。您不需要在服务器级别安装任何内容,只需安装 composer 包 就可以开始了。
Inspector 超级简单且 PHP 友好。您可以尝试我们的 Laravel 或 Symfony 包。
如果您正在寻找 HTTP 监控、数据库查询见解以及将警报和通知转发到您首选消息传递环境的能力,请免费尝试 Inspector。注册您的帐户。
或在网站上了解更多信息:https://inspector.dev
以上是如何在 PHP 中按日期对数组进行分组 – 快速提示的详细内容。更多信息请关注PHP中文网其他相关文章!