对象数组上的PHP usort函数不起作用
Posted
技术标签:
【中文标题】对象数组上的PHP usort函数不起作用【英文标题】:PHP usort function on object array not working 【发布时间】:2020-05-01 00:47:23 【问题描述】:我有以下对象数组:
array (
0 => MyObject::__set_state(array(
'id' => '1176',
'value' => 'Oranges',
)),
1 => MyObject::__set_state(array(
'id' => '1178',
'value' => 'Bananas',
)),
2 => MyObject::__set_state(array(
'id' => '1179',
'value' => 'grapes',
)),
)
我想按值升序排序,所以我使用以下内容:
usort($myObjectArray, function($a, $b)
return strcmp($a->value, $b->value);
);
但我什么都没有排序?
【问题讨论】:
请给我print_r($myObjectArray)
好吗
在3v4l.org分享演示
看起来像一个方法调用数组?
确保在比较之前将它们转换为统一大小写。 return strcmp(strtolower($a->value), strtolower($b->value));
@vivek_23 是的,我刚刚检查过,这就是问题所在。
【参考方案1】:
你可以这样做:
function cmp($a, $b)
return strcmp($a->value, $b->value);
);
usort($myObjectArray,"cmp");
【讨论】:
请为您的答案添加一些解释 - 是什么让您认为这表现不同?【参考方案2】:从php 7开始,你可以在比较函数中使用spaceship operator。
我刚刚使用下面的代码对其进行了测试,它可以按照您的预期工作,而无需使案例统一。
注意:我刚刚通过转换数组创建了一个 stdClass
对象数组。
$objArr = [
(Object) [
'id' => '1176',
'value' => 'Oranges',
],
(Object) [
'id' => '1178',
'value' => 'Bananas',
],
(Object) [
'id' => '1179',
'value' => 'grapes',
],
];
usort($objArr, function($a, $b)
// use return $b->value <=> $a->value;
// to reverse order
return $a->value <=> $b->value;
);
结果如下:
print_r($objArr);
Array
(
[0] => stdClass Object
(
[id] => 1178
[value] => Bananas
)
[1] => stdClass Object
(
[id] => 1176
[value] => Oranges
)
[2] => stdClass Object
(
[id] => 1179
[value] => grapes
)
)
如果大小写有问题(即葡萄和葡萄是否应该分类),则很有用。
【讨论】:
【参考方案3】:您可以尝试以下代码。我检查了它工作正常:
class MyObject
public $id;
public $value;
$a = [];
$ob = new MyObject();
$ob->id = '1176';
$ob->value = 'Lemons';
$ob2 = new MyObject();
$ob2->id = '1178';
$ob2->value = 'apples';
$ob3 = new MyObject();
$ob3->id = '1179';
$ob3->value = 'grapes';
$a[] = $ob;
$a[1] = $ob2;
$a[2] = $ob3;
usort( $a, function($a, $b)
return strcmp(mb_strtolower($a->value), mb_strtolower($b->value));
);
print_r($a);
输出:
Array
(
[0] => MyObject Object
(
[id] => 1178
[value] => apples
)
[1] => MyObject Object
(
[id] => 1179
[value] => grapes
)
[2] => MyObject Object
(
[id] => 1176
[value] => Lemons
)
)
您也可以查看 - Doc
【讨论】:
以上是关于对象数组上的PHP usort函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP usort() 通过用户自定义的比较函数对数组进行排序
我必须实现哪个 SPL 接口才能在对象上使用 usort() 函数?