如何从foreach中获取唯一值

时间:2017-09-13 07:49:36

标签: php laravel laravel-5.4

我想在下拉列表中获取唯一值。下拉代码是:

@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

谢谢。

4 个答案:

答案 0 :(得分:2)

建议您在控制器中解决此问题。不在视图中。在控制器中,您可以编写如下内容:

$admin_bills->pluck('created_at')->map->format('M, Y')->distinct();

我没有对此进行测试,但我认为这会让你朝着正确的方向前进。

我假设created_at属性被自动解析为碳对象。因为这是Laravel通常的工作方式。

答案 1 :(得分:1)

如果将此逻辑移动到控制器中,则可以通过简单的循环执行此操作:

$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']
}

答案 2 :(得分:0)

尝试在控制器中格式化它:

    $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');

答案 3 :(得分:0)

假设您的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