PHP数组奇数排序报错:Trying to access array offset on value of type bool
问题分析与解决:数组奇数排序保持偶数位置不变
问题描述
给定一个数字数组,需将其中的奇数按升序排序,同时保持偶数的原始位置不变,示例如下:
- [7, 1] => [1, 7]
- [5, 8, 6, 3, 4] => [3, 8, 6, 5, 4]
- [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] => [1, 8, 3, 6, 5, 4, 7, 2, 9, 0]
编写的PHP代码在第17行$arr[$n] = $oddNumbers[$oddPlaced];出现错误,提示Trying to access array offset on value of type bool,需排查布尔值的来源。
错误原因分析
- sort函数返回值误用:PHP的
sort()是原地排序函数,它直接修改传入的数组,返回值仅为布尔值(成功返回true,失败返回false)。你代码中$oddNumbers = sort($oddNumbers);这一行,把布尔值赋值给了$oddNumbers,导致后续它不再是数组,访问数组偏移时自然报错。 - 累加运算符错误:
$oddNumbersPlaced =+ 1是错误写法,这会直接把1赋值给变量,而非累加计数,正确写法应为$oddNumbersPlaced += 1或$oddNumbersPlaced++。 - 计数器重复重置:第二个循环中
$oddPlaced = 0放在循环内部,每次遍历数组元素时都会重置计数器,无法按顺序取出排序后的奇数。
修正后的代码
function sortArray(array $arr) : array { $oddNumbers = []; $oddNumbersPlaced = 0; // 提取数组中的奇数,标记原数组奇数位置 for ($i = 0; $i < count($arr); $i++) { if ($arr[$i] % 2 != 0) { $oddNumbers[$oddNumbersPlaced] = $arr[$i]; $arr[$i] = 'a'; $oddNumbersPlaced += 1; } } // 原地排序奇数数组,无需接收返回值 sort($oddNumbers); $oddPlaced = 0; // 计数器放在循环外,避免重复重置 for ($n = 0; $n < count($arr); $n++) { if ($arr[$n] == 'a') { $arr[$n] = $oddNumbers[$oddPlaced]; $oddPlaced++; } } return $arr; }
关键修改说明
- 移除
$oddNumbers初始的[0],避免引入无关元素干扰排序; - 修正累加运算符,确保正确统计奇数数量;
- 调用
sort()时不赋值返回值,利用其原地修改数组的特性; - 将
$oddPlaced移至第二个循环外部,保证按顺序替换原数组中的标记位置。
内容的提问来源于stack exchange,提问作者Maël Etienne
相关产品推荐
相关产品推荐

