PHP如何按两个字段对嵌套stdClass对象排序并保留键名?
如何按指定字段排序带URL键的stdClass对象?
我太懂这种卡壳的感觉了——既要保住那些关键的URL键(毕竟代码其他地方还要依赖它们),又要按kategorie和order_by字段排序,直接操作stdClass对象确实容易摸不着头绪。其实解决方案核心就是先转成关联数组再排序,因为PHP的排序函数对数组的支持远比对对象友好,而且转数组不会丢失你的URL键。
完整实现步骤
将stdClass对象转为关联数组
这一步是关键,因为array_multisort和array_column只对数组生效,转成数组后原URL键会完整保留:$entriesArray = (array)$entries;提取排序所需的字段数组
用array_column从数组中提取kategorie和order_by的值——不用担心子元素是对象,array_column可以直接读取对象的公共属性:$kategorieList = array_column($entriesArray, 'kategorie'); $orderByList = array_column($entriesArray, 'order_by');执行多字段排序
用array_multisort实现先按kategorie升序、再按order_by升序的逻辑,最后作用到我们的关联数组上:array_multisort( $kategorieList, SORT_ASC, SORT_STRING, // 先按kategorie升序,按字符串规则排序 $orderByList, SORT_ASC, SORT_STRING, // 再按order_by升序,同样按字符串规则 $entriesArray // 要排序的目标数组 );这里加上
SORT_STRING是因为你的字段值是字符串类型的数字,明确排序规则能避免潜在的类型问题,当然如果确定都是纯数字字符串,也可以用SORT_NUMERIC。(可选)转回stdClass对象
如果后续代码依然需要stdClass类型的对象,把排序后的数组再转回去即可:$sortedEntries = (object)$entriesArray;
为什么之前的代码失效?
你之前直接把stdClass对象传给array_multisort,但这个函数只支持数组类型的参数,对对象完全不生效。转成关联数组后,不仅保留了所有URL键,排序逻辑也能正常运行了。
完整示例代码
// 假设$entries是你的原stdClass对象 $entriesArray = (array)$entries; // 提取排序字段 $kategorieList = array_column($entriesArray, 'kategorie'); $orderByList = array_column($entriesArray, 'order_by'); // 执行排序 array_multisort( $kategorieList, SORT_ASC, SORT_STRING, $orderByList, SORT_ASC, SORT_STRING, $entriesArray ); // 转回对象(按需选择) $sortedEntries = (object)$entriesArray;
内容的提问来源于stack exchange,提问作者Hans Müller
相关产品推荐
相关产品推荐

