PHP中对对象数组使用usort函数无效

3

我有以下对象数组:

 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);
});  

但是我什么都没有排好序?

在 https://3v4l.org/ 上分享一个演示。 - nice_dev
1
在比较之前,请确保将它们转换为统一的大小写。return strcmp(strtolower($a->value), strtolower($b->value)); - nice_dev
@RiggsFolly 看起来 strcmp 是区分大小写的。将 grapes 改为 Grapes 可以解决这个问题。 - adam78
1
@vivek_23,是的,我刚刚检查了一下,那就是问题所在。 - adam78
MyObject::__set_state 的定义是什么? - apokryfos
显示剩余3条评论
3个回答

0

自 PHP 7 开始,你可以在比较函数中使用 太空船运算符

我用下面的代码进行了测试,它按预期工作,而且不需要使大小写一致。

注意:我只是通过将数组强制转换为 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
        )

)

如果大小写有影响(例如应该对葡萄和Grapes进行排序),这将非常有用。


0
你可以这样做:
function cmp($a, $b) {
    return strcmp($a->value, $b->value);
}); 
usort($myObjectArray,"cmp");

请在您的答案中添加一些解释 - 您认为这有何不同之处? - Nico Haase

0
你可以尝试下面的代码。我检查过它可以正常工作:
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
        )

)

另外,您还可以查看 - 文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接