PHP如何按对象属性排序数组,让非空observation字段的项优先排列
你的原有代码无法生效主要有两个原因:
- 访问方式不匹配:你给出的示例数据是PHP关联数组结构,原代码使用
->访问对象属性的写法不适用于数组,需要调整为[]读取数组键值。如果你调用json_decode时传入了第二个参数true,解析结果就是关联数组;如果没传该参数得到的是标准对象,保持->写法即可。 - 排序逻辑不符合需求:直接用
strcmp比较时,null会被转换为空字符串,默认会排在非空字符串前面,和你要求的「非空observation优先」规则相反。
正确实现代码
usort($this->rewards, function ($a, $b) { // 先判断observation的非空优先级 $aHasObs = !is_null($a['observation']); $bHasObs = !is_null($b['observation']); if ($aHasObs && !$bHasObs) { return -1; // 非空条目排前面 } if (!$aHasObs && $bHasObs) { return 1; // 空条目排后面 } // 同优先级(都非空/都为空)时按description升序排序,完全匹配你的预期输出 return strcmp($a['description'], $b['description']); });
如果你的解析结果是对象,把代码中所有$a['xxx']、$b['xxx']替换为$a->xxx、$b->xxx即可。
内容的提问来源于stack exchange,提问作者Renan Bessa
相关产品推荐
相关产品推荐

