本文详解如何在 laravel 中安全验证含数组字段(如 `price[]` 和 `unit_id[]`)的表单,解决因 `numeric` 规则误判非字符串值导致的 `htmlspecialchars(): argument #1 ($string) must be of type string, array given` 类型错误。
在 Laravel 表单中处理动态重复字段(如多组 price[] 和 unit_id[])时,常见的验证写法如下:
$request->validate([
'price' => 'required|array',
'price.*' => 'required|string|numeric|min:0|max:9999',
'unit_id' => 'required|array',
'unit_id.*' => 'required|integer|exists:units,id',
]);⚠️ 关键修正点:必须为 price.* 显式添加 required|string(或至少 string),原因如下:

✅ 推荐完整验证规则示例:
$request->validate([
'price' => 'required|array|min:1',
'price.*' => 'required|string|numeric|min:0|max:9999.99',
'unit_id' => 'required|array|min:1',
'unit_id.*' => 'required|integer|distinct|exists:units,id',
]);? 额外健壮性建议:
$validated = $request->validate(/* 上述规则 */);
// 强制转换 price 数值(保留两位小数)
$validated['price'] = collect($validated['price'])
->map(fn($p) => round((float)$p, 2))
->all();? 总结:numeric 规则本身不拒绝数组,但其底层逻辑与 Laravel 错误渲染机制(尤其是 old() + Blade 输出)耦合后易引发类型错误。*始终为 `数组项规则链前置string或required|string`,是预防该问题最直接、最符合 Laravel 最佳实践的方案。**