根据包含时间戳的对象值对数组进行排序

时间:2016-05-06 09:04:56

标签: php database laravel laravel-5 eloquent

首先,我创建了两个不同的查询。

$first = first::where('id',$request->first_id)->select('name','created_at')->get();
$second = second::where('id', $request->second_id)->select('name','created_at')->get();

然后我合并了两个结果数组。

$data_combine = array_merge($first->toArray(), $second->toArray());

最后,我想根据created_at值按升序对组合数组进行排序,例如' 2016-05-06 16:43:46'。

3 个答案:

答案 0 :(得分:3)

您可以使用Laravel Collection方法轻松完成此操作。与常规数组不同,使用Collection,您仍然可以访问Laravel在模型上提供的所有其他有用的收集方法。

您可以将数组合并到一个新集合中,然后对该集合进行排序。

collect(array_merge($first -> toArray(), $second -> toArray())) -> sortBy('created_at');

更流畅的写作方式也可以起作用

$first -> push($second) -> flatten() -> sortBy('created_at');

要实现此目标,created_at需要显示。如果尚未在模型的可见属性中定义(并且可以安全地执行此操作),则需要先添加该属性。否则,您需要循环初始集合并运行addVisible('created_at')以使其对您当前的结果可见。

答案 1 :(得分:1)

$array = array_values(array_sort($data_combine , function ($value) {
    return $value['created_at'];
}));

您可以使用array_sort函数对合并的数组进行排序。

https://laravel.com/docs/5.0/helpers#arrays

答案 2 :(得分:0)

无需使用toArray(),因为Collection有all()方法:

$combine = collect(array_merge($first->all(), $second->all()))->sortByDesc("created_at");

如果两个数组中只有一个元素,可以尝试:

$combine = collect([$first->first(), $second->first()])->sortByDesc("created_at");