PHP布尔值数组可用sort()等函数直接排序,因false转0、true转1,升序时false在前、true在后;arsort()等保留键名且稳定分组同值元素;需严格分组时应使用uasort()自定义比较逻辑。

PHP 里没有专门针对「布尔值数组」的排序函数,但你根本不需要特殊处理——arsort()、asort()、sort() 都能直接排,关键在于理解 PHP 如何比较 true 和 false。
布尔值在 PHP 排序中会被自动转成整数
PHP 把 false 当作 0,true 当作 1(无论显式或隐式转换)。所以排序本质是按 0 和 1 的数值大小进行的:
-
sort()升序 →false在前,true在后 -
rsort()降序 →true在前,false在后 -
asort()/arsort()同理,只是保留键名
示例:
$bools = [true, false, true, false, true]; sort($bools); // 结果:[false, false, true, true, true]
用 arsort() 保持键名时要注意顺序稳定性
如果你用的是关联数组(比如 ['a' => true, 'b' => false, 'c' => true]),arsort() 会把 true 值的元素排前面,false 的排后面,但相同值(如多个 true)之间的原始相对顺序**不一定保留**——PHP 7.0+ 的 arsort() 是稳定排序,但仅限于「相等元素在原数组中位置不变」;而布尔值被转为整数后,所有 true 都变成 1,所有 false 变成 0,所以稳定性只体现在同为 true 或同为 false 的组内。
立即学习“PHP免费学习笔记(深入)”;
也就是说:arsort() 不会打乱 true 元素之间原本的键顺序,也不会打乱 false 元素之间的键顺序,但 true 组一定整体在 false 组之前。
想按 false/true 分组但保持原始插入顺序?别用内置函数硬套
如果业务要求是「所有 false 按原顺序排前面,所有 true 按原顺序排后面」(即稳定分组),usort() 更可控:
$data = ['x' => true, 'y' => false, 'z' => true, 'w' => false];
uasort($data, function($a, $b) {
if ($a === $b) return 0;
return $a ? -1 : 1; // true 排前面?改成 $a ? 1 : -1 就让 false 在前
});
// 结果:['y'=>false, 'w'=>false, 'x'=>true, 'z'=>true]
注意点:
- 必须用
uasort()(带键)或usort()(不带键),不能依赖arsort()的隐式行为 - 比较函数里用
===判断全等,避免0/1/''/null混淆 - 返回
-1表示$a应在$b前,别写反
scandir() 返回的布尔值?那不是布尔值数组
有人看到 scandir() 文档里写「失败返回 false」就误以为它能返回布尔值数组——其实不会。scandir() 成功时返回字符串数组(文件名列表),失败才返回单个 false。它和布尔值排序完全无关,别混淆。
真正容易踩坑的是:把非布尔数组(比如含 0、1、''、null 的混合数组)当成布尔值数组去排,结果被类型强制转换带偏。排序前先用 var_dump() 确认实际数据类型。



















