如何在laravel上对物体进行排序?

时间:2017-06-18 07:44:17

标签: php laravel sorting 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
        )

)

我想按ID

对其进行排序

如果在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>';

它有效

但是如何使用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;
} 

不起作用

存在这样的错误:

  

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

我该如何解决?

3 个答案:

答案 0 :(得分:5)

不要重新发明轮子。 Laravel是一个很棒的框架,已经为你做了很多工作。

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

$c = collect($c);

现在,对于使用集合,您可以使用一组很好的 available methods 。在您的情况下,您需要 sortBy()

$sorted = $c->sortBy('id');

或者,您可以传递回调:

$sorted = $c->sortBy(function ($item, $key) {
    return $item->id;
});

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

$c = $c->all();

// or

$c = $c->toArray();

答案 1 :(得分:3)

试试这个

public function add($param)
{
    ...
    usort($c, function($a, $b){
        if($a->id == $b->id) { 
        return 0 ; 
    } 
    return ($a->id < $b->id) ? -1 : 1;
    }); 
    echo '<pre>';print_r($c);echo '</pre>';die();
    ...
}

您无需使用其他sortById方法

答案 2 :(得分:2)

如果你想要一个纯粹的PHP方式:

在第一种情况下,您尝试将程序函数作为回调函数传递给usort函数。

当您想要从类中传递方法作为回调时,您需要按如下方式传递它:

usort($c, [$this, 'sortById']);

查看usort手册页中的第三个示例。

请注意,只要您在班级内,就会使用$this变量。例如,如果要使用其他类的上下文,则需要按如下方式传递实例:

$object = new someClass;
usort($c, [$object, 'sortById']);

如果你需要传递一个静态方法,你可以按如下方式传递它:

usort($c, ['someClass', 'sortById']);