如何对 laravel 上的对象进行排序?

How can I sort object on laravel?

我的对象数组 ($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;
} 

没用

存在这样的错误:

Undefined property ... $sortById ...

我该如何解决?

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

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

$c = collect($c);

现在,为了处理集合,您有一组不错的 available methods you can work with. In your case, you need the sortBy():

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

或者,您可以传递回调:

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

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

$c = $c->all();

// or

$c = $c->toArray();

试试这个

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方法

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

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

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

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

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

请注意,只要您在 class 范围内,您就会使用 $this 变量。例如,如果您想使用另一个 class 的上下文,则需要按如下方式传递实例:

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

此外,如果您需要传递静态方法,您可以按如下方式简单地传递它:

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