如何对 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']);
我的对象数组 ($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']);