如何从 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