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 ." ". $gend ." [". $age ."]"; // 家属和主乘客同编号,不需要额外自增计数器 $manf .= "<br />". $person ." : ". $lastname .", ". $companion ." ". $comp ." [". $ag2 ."]</span>"; } else { $manf .= "<br />". $person ." : ". $lastname .", ". $first ." ". $first2 ." ". $gend ." [". $age ."]"; } // 单组乘客处理完成后统一自增计数器 $person++; } return $manf; }
补充说明
如果你的$pax参数指的是总乘客人数(而非主乘客组数),则需要额外新增总人数计数器,每次添加主乘客、家属时都累加计数,达到$pax就终止循环,避免生成的乘客人数超出要求。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

