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

PHP中$person自增触发内存耗尽错误的解决办法咨询

问题根因
  • 死循环触发内存溢出:你代码中的for循环未设置终止条件,仅靠if($person == $pax) break;跳出。当启用注释的$person++后,单次循环内$person会被累加2次:一次是家属逻辑内手动添加的自增,一次是for循环第三段的默认迭代自增,会直接跳过$person等于$pax的数值点,永远无法触发终止条件进入死循环。死循环过程中$manf字符串会不断拼接内容,直到耗尽PHP分配的内存上限,触发你看到的报错。
  • 计数器逻辑错位:你的业务需求是主乘客和其家属使用同一个编号,因此$person的自增应该放在单组乘客(主乘客+可能的家属)处理完成之后,而不是放在for循环的默认迭代位置。
修复方案

调整循环控制逻辑,改用while循环手动控制计数器增长,避免自动自增跳过终止阈值,修复后代码如下:

function insertPax($class, $pax, $nat) {
    $manf = ''; // 初始化变量避免未定义警告
    $person = 1;
    // 改用while循环手动控制计数器
    while($person <= $pax) {
        $fam       = 0;
        $first     = "";
        $first2    = "";

        $id        = array_rand($_SESSION['LAST'. $nat],1);
        $lastname  = $_SESSION['LAST'. $nat][$id];

        $gender    = rand(0,1);
        if($gender == 1) {
            $md    = array_rand($_SESSION['MALE'. $nat],1);
            $first = $_SESSION['MALE'. $nat][$md];
            $sec   = rand(1,8); 
            if($sec == 1) { 
                $m2 = array_rand($_SESSION['MALE'. $nat],1); 
                $first2 = $_SESSION['MALE'. $nat][$m2]; 
            }
            $gend  = "MALE"; 
            $comp = "FEMALE"; 
            $age = rand(18,80);
        } else {
            $fd    = array_rand($_SESSION['FEMALE'. $nat],1);
            $first = $_SESSION['FEMALE'. $nat][$fd];
            $sec   = rand(1,8); 
            if($sec == 1) { 
                $f2 = array_rand($_SESSION['FEMALE'. $nat],1); 
                $first2 = $_SESSION['FEMALE'. $nat][$f2]; 
            } 
            $gend  = "FEMALE"; 
            $comp = "MALE"; 
            $age = rand(17,80);
        }
        
        $fam = rand(1,4);
        if($fam == 1) {
            $ag2 = rand(17,80); 
            $cmp = array_rand($_SESSION[$comp . $nat],1);
            $companion = $_SESSION[$comp . $nat][$cmp];
            
            $manf .= "<br /><span style='color:yellow;'>". $person ." : ". $lastname .", ". $first ." ". $first2 ." &nbsp; ". $gend ." [". $age ."]"; 
            // 家属和主乘客同编号,不需要额外自增计数器
            $manf .= "<br />". $person ." : ". $lastname .", ". $companion ." &nbsp; ". $comp ." [". $ag2 ."]</span>"; 
                        
        } else {    
            $manf .= "<br />". $person ." : ". $lastname .", ". $first ." ". $first2 ." &nbsp; ". $gend ." [". $age ."]";
        }
        // 单组乘客处理完成后统一自增计数器
        $person++;
    }
    return $manf;
}

补充说明

如果你的$pax参数指的是总乘客人数(而非主乘客组数),则需要额外新增总人数计数器,每次添加主乘客、家属时都累加计数,达到$pax就终止循环,避免生成的乘客人数超出要求。

内容的提问来源于stack exchange,提问作者Erik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:06:07