我的对象数组($ 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 ...
我该如何解决?
答案 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']);