【问题标题】:How can I sort object on laravel?如何在 laravel 上对对象进行排序?
【发布时间】:2017-11-20 14:53:52
【问题描述】:

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

我该如何解决?

【问题讨论】:

  • 虽然提供了对包含对象的数组进行排序的解决方案,但我建议您看一下,为什么您首先会得到这样的结构。 Laravel 在大多数情况下都内置了 toArray 方法,因此您可以在调用时将对象转换为数组。

标签: php laravel sorting laravel-5.3


【解决方案1】:

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

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

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

【讨论】:

  • 它有效。但结果:Array ( [3] =&gt; stdClass Object ( [id] =&gt; 1 [name] =&gt; city.png ) [0] =&gt; stdClass Object ( [id] =&gt; 3 [name] =&gt; chelsea.png ) [1] =&gt; stdClass Object ( [id] =&gt; 4 [name] =&gt; arsenal.png ) [2] =&gt; stdClass Object ( [id] =&gt; 5 [name] =&gt; mu.png ) )。指数:3 -> 0 -> 1 ->2。我希望索引也改变。应该是这样的:0->1->2->3
  • @TrendingNews 对结果使用values() 方法,如下所示:$c = $c-&gt;values()-&gt;toArray(); 了解 values() 方法here
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

    如果你想要纯php方式:

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

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

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

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

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

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

    如果你需要传递一个静态方法,你可以简单地传递它,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2018-10-31
      • 2019-12-17
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多