对象数组上的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() 函数?

usort() 自定义排序

PHP 数组对象 按照某个字段进行排序

usort — 使用用户自定义的比较函数对数组中的值进行排序

PHP多维数组的排序问题