PHP按包含可选键的多字段对数组排序的实现方案
解决方案
方案1:使用usort自定义排序逻辑(推荐)
array_multisort要求传入的排序维度数组长度必须和原数组完全一致,直接用array_column读取可选键会过滤掉不存在该键的元素,所以触发长度不一致警告。改用usort在回调中动态判断字段是否存在,不需要修改原数组:
usort($data, function($a, $b) { // 优先按bookID升序 $bookCmp = (int)$a['bookID'] <=> (int)$b['bookID']; if ($bookCmp !== 0) { return $bookCmp; } // bookID相同按chapter升序 $chapterCmp = (int)$a['chapter'] <=> (int)$b['chapter']; if ($chapterCmp !== 0) { return $chapterCmp; } // 最后处理versesFirst,不存在的默认赋值为0(排最前面) $aVerse = isset($a['versesFirst']) ? (int)$a['versesFirst'] : 0; $bVerse = isset($b['versesFirst']) ? (int)$b['versesFirst'] : 0; return $aVerse <=> $bVerse; });
运行后排序结果符合要求,bookID=75的两个元素会按versesFirst升序排列,versesFirst=1的项排在前面。
方案2:仍使用array_multisort,生成临时排序维度数组
如果不想换array_multisort,可以通过array_map生成补齐默认值的临时维度数组,不会修改原数组:
// 生成versesFirst维度的临时数组,不存在的补0 $versesFirst = array_map(function($item) { return isset($item['versesFirst']) ? (int)$item['versesFirst'] : 0; }, $data); array_multisort( array_column($data, 'bookID'), SORT_ASC, array_column($data, 'chapter'), SORT_ASC, $versesFirst, SORT_ASC, $data );
内容的提问来源于stack exchange,提问作者knot22
相关产品推荐
相关产品推荐

