使用PHP求解一元二次方程时系数提取数组匹配错误如何解决
问题根因
你之前使用全局匹配所有数字的逻辑,没有区分系数位置,当二次项/一次项系数为1或-1时,方程写法会省略数字,自然匹配不到对应数值,导致数组下标错位。
解决方案
方案一:按项拆分匹配系数(推荐)
不要直接全局抓取所有数字,拆分二次项、一次项、常数项分别提取,自动补全省略的1/-1,PHP实现示例如下:
$equation = "x^2 + 5x + 10 = 0"; // 先移除所有空格避免干扰 $equation = str_replace(' ', '', $equation); // 正则匹配三个系数位置 preg_match('/([+-]?\d*)x\^2([+-]?\d*)x([+-]?\d+)=0/', $equation, $matches); // 处理a的省略场景 $a = match(true) { $matches[1] === '' || $matches[1] === '+' => 1, $matches[1] === '-' => -1, default => (int)$matches[1] }; // 处理b的省略场景 $b = match(true) { $matches[2] === '' || $matches[2] === '+' => 1, $matches[2] === '-' => -1, default => (int)$matches[2] }; // 常数项直接取值 $c = (int)$matches[3];
该方案兼容系数为正、负、省略1的所有场景,不会出现下标错位问题。
方案二:预处理方程补全缺失系数
在提取数字前,先把所有省略1的位置补全,再用你原来的全局匹配逻辑即可:
$equation = "x^2 + 5x + 10 = 0"; // 补全中间省略的系数 $processed = str_replace([' x^2', '-x^2', ' x', '-x'], ['1x^2', '-1x^2', '1x', '-1x'], $equation); // 补全开头为x^2的场景 $trimmed = trim($processed); if (str_starts_with($trimmed, 'x^2')) { $processed = '1' . $trimmed; } // 用原有逻辑提取数字即可 preg_match_all('/-?\d+/', $processed, $nums); $a = $nums[0][0]; $b = $nums[0][1]; $c = $nums[0][2];
内容的提问来源于stack exchange,提问作者Viktoriya Beryozko
相关产品推荐
相关产品推荐

