laravel 如何在laravel上对对象进行排序?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/44612789/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I sort object on laravel?
提问by Success Man
My object array ($c) like this :
我的对象数组 ($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
)
)
I want to sort it by id
我想按id排序
If in php normal I try like this :
如果在 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>';
It works
有用
But How can I implement it use laravel?
但是我如何使用laravel来实现它?
I try like this :
我尝试这样:
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;
}
It does not work
这是行不通的
There exist error like this :
存在这样的错误:
Undefined property ... $sortById ...
未定义的属性 ... $sortById ...
How can I solve it?
我该如何解决?
回答by lesssugar
Don't reinvent the wheel. Laravel is a fantastic framework that did lots of work for you already.
不要重新发明轮子。Laravel 是一个很棒的框架,它已经为你做了很多工作。
First, you need to convert your array to a Collection:
首先,您需要将数组转换为集合:
$c = collect($c);
Now, For working with collections, you have a nice set of available methodsyou can work with. In your case, you need the sortBy():
现在,对于使用集合,您有一组很好的可用方法可以使用。在您的情况下,您需要sortBy():
$sorted = $c->sortBy('id');
Alternatively, you can pass a callback:
或者,您可以传递回调:
$sorted = $c->sortBy(function ($item, $key) {
return $item->id;
});
Both of these will return a Collection object. If you want to get an Array back instead, use all()
or toArray()
on your result:
这两个都将返回一个 Collection 对象。如果您想取回数组,请在结果上使用all()
或toArray()
:
$c = $c->all();
// or
$c = $c->toArray();
回答by Nazmul Hasan
Try this
尝试这个
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();
...
}
You don't need to use different sortById
method
你不需要使用不同的sortById
方法
回答by hassan
If you want a pure php way:
如果你想要一个纯 php 的方式:
In your first case you are trying to pass a procedural functionas a callback to your usort
function.
在您的第一种情况下,您试图将过程函数作为回调传递给您的usort
函数。
When you want to pass a methodfrom a class as a callback you need to pass it as follows:
当您想将类中的方法作为回调传递时,您需要按如下方式传递它:
usort($c, [$this, 'sortById']);
Checkout the third example from the usort
man page.
查看usort
手册页中的第三个示例。
Note that, you will using the $this
variable as long as you are within the class. If you want to use the context of another class for example, you will need to pass the instance as follows:
请注意,$this
只要您在班级内,就会使用该变量。例如,如果要使用另一个类的上下文,则需要按如下方式传递实例:
$object = new someClass;
usort($c, [$object, 'sortById']);
Also in case if you need to pass a static method you can simply pass it as follows:
另外,如果您需要传递静态方法,您可以简单地按如下方式传递它:
usort($c, ['someClass', 'sortById']);