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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:27:01