PHP usort数组排序 如何将Undefined元素前置其余降序
PHP二维数组自定义排序实现(Undefined值置顶+数值降序)
问题场景
存在二维数组$unresponsives,每个子数组索引5位为时长字段,包含两类值:
- 格式类似
"2327.02 Hours"的有效时长字符串 - 固定字符串
"Undefined"
原有usort排序逻辑仅实现了有效时长的降序排列,会将Undefined条目排到末尾,需要调整规则将所有Undefined条目置顶,剩余条目仍按时长降序排列。
实现代码
直接修改usort的比较函数即可,完整代码如下:
usort($unresponsives, function ($unresponsive1, $unresponsive2) { $val1 = $unresponsive1[5]; $val2 = $unresponsive2[5]; // 优先判断Undefined值,统一置顶 $isUndef1 = $val1 === 'Undefined'; $isUndef2 = $val2 === 'Undefined'; if ($isUndef1 && $isUndef2) { return 0; } if ($isUndef1) { return -1; } if ($isUndef2) { return 1; } // 非Undefined值按小时数降序排序 return floatval($val2) <=> floatval($val1); });
逻辑说明
- 比较时先判断两个对比项的时长字段是否为
Undefined,只要其中一个是该值,就优先把它放到更靠前的位置;两个都是Undefined时返回0,保留二者原有的相对顺序 - 非
Undefined的条目完全沿用原有排序逻辑,floatval会自动提取字符串开头的数字部分,不需要额外替换" Hours"后缀就能拿到正确的浮点型小时数,再通过太空船运算符<=>实现降序排列 - 该写法兼容PHP7及以上版本,和原有代码的依赖版本完全一致,不需要调整运行环境
内容的提问来源于stack exchange,提问作者m.yagmur
相关产品推荐
相关产品推荐

