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; });
四、额外的排查小技巧
- 先验证字段是否存在:排序前先循环打印每个元素的排序值,确认字段存在且有正确数值:
foreach ($yourJsonArray as $item) { var_dump($item->_data['nid']['entity']->field_listing_order_value ?? '该字段不存在'); }
如果输出里有该字段不存在,说明你得重新核对对象结构,修正字段路径。
确认数组元素类型:确保你的数组里全是
stdClass对象,如果混合了数组,那访问方式要改成数组形式(比如$item['_data']['nid']['entity']['field_listing_order_value'])。注意usort的返回值要求:排序函数必须返回整数(-1、0、1),如果返回布尔值或其他类型,会导致排序异常,所以一定要把排序值转成整数后再比较。
内容的提问来源于stack exchange,提问作者Nisarg




