如何从 foreach 获取唯一值
How to get unique values from foreach
我正在尝试在下拉列表中获取唯一值。下拉代码是:
@foreach($admin_bills as $admin_bill)
<?php $month = date('M, Y', strtotime($admin_bill->created_at)); ?>
<option value="{{ $admin_bill->id }}">{{ $month }}</option>
@endforeach
这为我提供了基于 created_at
的所有值。例如,如果同一个月有多个条目,它会给我这样的结果
Aug, 2017
Aug, 2017
Aug, 2017
Sep, 2017
Sep, 2017
但是如果同月有多个条目,我希望它们在下拉列表中显示一次。所以结果会是这样的:
Aug, 2017
Sep, 2017
我不能在这里简单地使用像 array_unique()
这样的函数,$admin_bill->id
应该得到唯一的 $month
的第一个 id。我怎样才能做到这一点?请帮忙。我正在使用 Laravel 5.4
谢谢。
如果将此逻辑移动到控制器中,则可以通过一个简单的循环来完成:
$uniques = [];
foreach ($admin_bills as $bills) {
$month = date('M, Y', strtotime($bills->created_at));
if (!in_array($month, $uniques)) {
$uniques[] = [
'date' => $month,
'id' => $bills->id
];
}
}
// Useage
foreach ($uniques as $v) {
$v['id']
$v['date']
}
尝试在您的控制器中对其进行格式化:
$admin_bills_formated = $admin_bills->map(function ($item, $key) {
$item->month = Carbon::parse($item->created_at)->month;
return $item;
});
$admin_bills_grouped = admin_bills_formated->groupBy('month');
建议您在控制器中解决。不在视野中。在控制器中,您可以编写如下内容:
$admin_bills->pluck('created_at')->map->format('M, Y')->distinct();
我没有对此进行测试,但我认为它会让你朝着正确的方向前进。
我假设 created_at
属性 被自动解析为碳对象。因为那是 Laravel 通常的工作方式。
假设您的 admin_bills
变量是一个集合并且 created_at
字段是一个 Carbon
实例。
在你的控制器中
$adminBillUniqueMonths = $adminBills->unique(function($bill) {
$bill->created_at->format('Ym');
});
在你看来
@foreach($adminBillUniqueMonths as $bill)
<option value="{{ $bill->id }}">{{ $bill->created_at->format('M, Y') }}</option>
@endforeach
我正在尝试在下拉列表中获取唯一值。下拉代码是:
@foreach($admin_bills as $admin_bill)
<?php $month = date('M, Y', strtotime($admin_bill->created_at)); ?>
<option value="{{ $admin_bill->id }}">{{ $month }}</option>
@endforeach
这为我提供了基于 created_at
的所有值。例如,如果同一个月有多个条目,它会给我这样的结果
Aug, 2017
Aug, 2017
Aug, 2017
Sep, 2017
Sep, 2017
但是如果同月有多个条目,我希望它们在下拉列表中显示一次。所以结果会是这样的:
Aug, 2017
Sep, 2017
我不能在这里简单地使用像 array_unique()
这样的函数,$admin_bill->id
应该得到唯一的 $month
的第一个 id。我怎样才能做到这一点?请帮忙。我正在使用 Laravel 5.4
谢谢。
如果将此逻辑移动到控制器中,则可以通过一个简单的循环来完成:
$uniques = [];
foreach ($admin_bills as $bills) {
$month = date('M, Y', strtotime($bills->created_at));
if (!in_array($month, $uniques)) {
$uniques[] = [
'date' => $month,
'id' => $bills->id
];
}
}
// Useage
foreach ($uniques as $v) {
$v['id']
$v['date']
}
尝试在您的控制器中对其进行格式化:
$admin_bills_formated = $admin_bills->map(function ($item, $key) {
$item->month = Carbon::parse($item->created_at)->month;
return $item;
});
$admin_bills_grouped = admin_bills_formated->groupBy('month');
建议您在控制器中解决。不在视野中。在控制器中,您可以编写如下内容:
$admin_bills->pluck('created_at')->map->format('M, Y')->distinct();
我没有对此进行测试,但我认为它会让你朝着正确的方向前进。
我假设 created_at
属性 被自动解析为碳对象。因为那是 Laravel 通常的工作方式。
假设您的 admin_bills
变量是一个集合并且 created_at
字段是一个 Carbon
实例。
在你的控制器中
$adminBillUniqueMonths = $adminBills->unique(function($bill) {
$bill->created_at->format('Ym');
});
在你看来
@foreach($adminBillUniqueMonths as $bill)
<option value="{{ $bill->id }}">{{ $bill->created_at->format('M, Y') }}</option>
@endforeach