You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,需排查布尔值的来源。

错误原因分析

  1. sort函数返回值误用:PHP的sort()是原地排序函数,它直接修改传入的数组,返回值仅为布尔值(成功返回true,失败返回false)。你代码中$oddNumbers = sort($oddNumbers);这一行,把布尔值赋值给了$oddNumbers,导致后续它不再是数组,访问数组偏移时自然报错。
  2. 累加运算符错误:$oddNumbersPlaced =+ 1是错误写法,这会直接把1赋值给变量,而非累加计数,正确写法应为$oddNumbersPlaced += 1或$oddNumbersPlaced++。
  3. 计数器重复重置:第二个循环中$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:19:55