PHP-ML最小二乘法循环变量报错:array_unshift参数类型异常排查
解决PHP-ML LeastSquares循环生成样本触发array_unshift错误的问题
问题原因分析
你遇到的TypeError: array_unshift() expects parameter 1 to be array, string given错误,核心原因是你传递给LeastSquares的样本数据不是真正的PHP数组,而是拼接出来的字符串。
看你的代码:你通过循环把样本数据拼接成了类似"[2018, 1, 1], [2019, 2, 2]"的字符串,然后把这个字符串放到了$samples数组里($samples = [$dat1];)。但PHP-ML的LeastSquares::train()方法要求$samples必须是多维数组——每个元素都是一个包含特征值的子数组,比如[[2018,1,1], [2019,2,2]],而不是包含字符串的数组。当LeastSquares内部尝试对这个字符串执行array_unshift操作时,自然就触发了类型错误。
手动添加样本时能正常运行,是因为你直接传入了真正的多维数组,完全符合方法的参数要求。
解决方案:直接生成数组而非字符串
把循环拼接字符串的逻辑改成直接生成PHP数组,具体修改如下:
修正样本数据生成代码
// 生成samples数组:直接存储每个样本的特征数组 $query1 = "SELECT * FROM master_data"; $result1 = mysqli_query($conn, $query1); $samples = []; // 直接初始化数组,不用字符串拼接 while($row1 = mysqli_fetch_array($result1)){ $TH = number_clean($row1['TH']); $B = $row1['B']; // 把当前行的特征值作为子数组添加到samples中 $samples[] = [ (int)$row1["T"], // 确保类型正确,根据实际数据类型调整 $B, $TH ]; } // 生成targets数组:直接存储每个样本的目标值 $query2 = "SELECT * from master_data"; $result2 = mysqli_query($conn, $query2); $targets = []; // 同样初始化数组 while($row2 = mysqli_fetch_array($result2)){ // 转换为数值类型,避免字符串影响模型训练 $targets[] = (float)$row2["Penjualan"]; }
修正训练和预测代码
现在直接用生成的数组传入train方法即可,不需要再依赖$dat1和$dat2:
$tgl = $_POST['tgl']; // 这里假设$t、$b、$th是你从$tgl或其他地方获取的预测特征值,确保是正确的数值类型 $t = ...; // 根据你的业务逻辑赋值 $b = ...; $th = ...; $regression = new LeastSquares(); $regression->train($samples, $targets); // 直接传入多维数组$samples和数值数组$targets $result = round($regression->predict([$t, $b, $th])); echo $t."<br>"; echo $b."<br>"; echo $th."<br>"; echo $result."<br>";
额外优化建议
- 可以合并两次数据库查询,只执行一次
SELECT * FROM master_data,同时收集特征和目标值,减少数据库交互次数; - 确保所有特征值和目标值都是数值类型(int/float),避免字符串干扰模型计算;
- 如果必须从前端接收数组形式的字符串,可使用
json_decode解析为PHP数组,但要确保前端传递的格式是标准JSON(比如"[[2018,1,1],[2019,2,2]]")。
内容的提问来源于stack exchange,提问作者ridwan ariana
相关产品推荐
相关产品推荐

