如何在laravel上对对象排序?

Suc*_*Man 3 php sorting laravel laravel-5.3

我的对象数组($ c)像这样:

Array
(
    [0] => stdClass Object
        (
            [id] => 3
            [name] => chelsea.png
        )

    [1] => stdClass Object
        (
            [id] => 4
            [name] => arsenal.png
        )

    [2] => stdClass Object
        (
            [id] => 5
            [name] => mu.png
        )

    [3] => stdClass Object
        (
            [id] => 1
            [name] => city.png
        )

)
Run Code Online (Sandbox Code Playgroud)

我想按编号排序

如果在PHP正常我尝试这样:

function sort_by_id( $a, $b )
{ 
  if(  $a->id ==  $b->id ){ return 0 ; } 
  return ($a->id < $b->id) ? -1 : 1;
} 
usort($c,'sort_by_id');  
echo '<pre>';print_r($c);echo '</pre>';
Run Code Online (Sandbox Code Playgroud)

有用

但是如何使用laravel来实现呢?

我这样尝试:

public function add($param)
{
    ...
    usort($c, $this->sortById()); 
    echo '<pre>';print_r($c);echo '</pre>';die();
    ...
}

private function sortById($a, $b)
{ 
    if($a->id == $b->id) { 
        return 0 ; 
    } 
    return ($a->id < $b->id) ? -1 : 1;
} 
Run Code Online (Sandbox Code Playgroud)

这是行不通的

存在这样的错误:

未定义的属性... $ sortById ...

我该如何解决?

les*_*gar 8

不要重新发明轮子。Laravel是一个出色的框架,已经为您完成了很多工作。

首先,您需要将数组转换为Collection:

$c = collect($c);
Run Code Online (Sandbox Code Playgroud)

现在,对于使用集合,您可以使用一组不错的可用方法。在您的情况下,您需要sortBy()

$sorted = $c->sortBy('id');
Run Code Online (Sandbox Code Playgroud)

另外,您可以传递一个回调:

$sorted = $c->sortBy(function ($item, $key) {
    return $item->id;
});
Run Code Online (Sandbox Code Playgroud)

这两个都将返回Collection对象。如果您想取回数组,请在结果上使用all()toArray()

$c = $c->all();

// or

$c = $c->toArray();
Run Code Online (Sandbox Code Playgroud)

  • @TrendingNews 在结果上使用 `values()` 方法,如下所示:`$c = $c-&gt;values()-&gt;toArray();` 阅读有关values() 方法的信息 [此处](https://laravel .com/docs/5.3/collections#method-values)。 (2认同)