You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP中用usort按field_listing_order的value字段排序JSON对象数组遇问题

排查usort按field_listing_order.value排序失败的问题

先帮你梳理下可能的问题点和对应的解决办法,结合你给出的对象结构来分析:

一、先确认排序字段的正确访问路径

从你贴的对象结构来看,field_listing_order的value字段是嵌套在_data数组的子对象里的,正确的访问路径应该是:

// 每个数组元素(stdClass对象)的排序值获取方式
$item->_data['nid']['entity']->field_listing_order_value;

(你结构里写的field_listing_orde...应该是截断了,实际字段名应该是类似field_listing_order_value的形式)
如果你的排序函数里没写对这个路径,那肯定没法正确排序,这是最常见的坑。

二、避坑:常见的错误排序写法

比如很多人会犯的错误:要么取错了外层的field_api_order_value字段(你结构里也有这个字段,但不是你要的),要么把_data当成对象用->访问(实际上它是数组,得用[]),比如这种错误写法:

usort($yourArray, function($a, $b) {
    // 错误:要么取错字段,要么路径写错
    return $a->field_api_order_value - $b->field_api_order_value;
});

这种写法自然得不到你想要的排序结果。

三、正确的usort实现代码

结合你的对象结构,正确的排序函数应该这么写,还加了字段不存在的容错处理:

usort($yourJsonArray, function($objA, $objB) {
    // 先安全获取两个对象的排序值,给默认值避免报错
    $orderA = isset($objA->_data['nid']['entity']->field_listing_order_value) 
        ? (int)$objA->_data['nid']['entity']->field_listing_order_value 
        : 0;
    
    $orderB = isset($objB->_data['nid']['entity']->field_listing_order_value) 
        ? (int)$objB->_data['nid']['entity']->field_listing_order_value 
        : 0;

    // 升序排序:小的在前,大的在后
    if ($orderA === $orderB) {
        return 0;
    }
    return $orderA < $orderB ? -1 : 1;

    // 如果要降序,把最后一行改成:return $orderA > $orderB ? -1 : 1;
});

四、额外的排查小技巧

  1. 先验证字段是否存在:排序前先循环打印每个元素的排序值,确认字段存在且有正确数值:
foreach ($yourJsonArray as $item) {
    var_dump($item->_data['nid']['entity']->field_listing_order_value ?? '该字段不存在');
}

如果输出里有该字段不存在,说明你得重新核对对象结构,修正字段路径。

  1. 确认数组元素类型:确保你的数组里全是stdClass对象,如果混合了数组,那访问方式要改成数组形式(比如$item['_data']['nid']['entity']['field_listing_order_value'])。

  2. 注意usort的返回值要求:排序函数必须返回整数(-1、0、1),如果返回布尔值或其他类型,会导致排序异常,所以一定要把排序值转成整数后再比较。

内容的提问来源于stack exchange,提问作者Nisarg

火山引擎 最新活动