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

如何在Laravel控制器中高效解析表单传入的JSON字符串化附加项数组?

更高效解析Laravel请求中JSON字符串数组的方法

场景说明

前端通过动态渲染复选框,将附加项的完整JSON字符串作为值提交到Laravel控制器,后端当前用foreach循环逐个解析这些JSON字符串,想找更高效的替代方式。

前端渲染代码

data.add_ons.map(async (item, i) => {
    addOnHtml += `
    <div class="d-flex align-items-center justify-content-between border-bottom pt-2">
        <div>
            <input type="checkbox" id="addon${i}" class="addonCheck" name="addon[${i}]" value='${JSON.stringify(item)}' data-price="${item.price}">
            <label for="addon${i}" style="font-size: 18px;margin-left:5px"> ${item.name}</label>
        </div>
        <h5>
            $${item.price}
        </h5>
    </div>`
})

控制器接收的请求数据

{
  "addon": [
    "{\"id\":1,\"name\":\"pepsi\",\"price\":10,\"created_at\":\"2022-12-09T18:12:35.000000Z\",\"updated_at\":\"2022-12-09T18:12:35.000000Z\",\"restaurant_id\":1,\"status\":1}",
    "{\"id\":2,\"name\":\"Extra Cheese\",\"price\":4,\"created_at\":\"2022-12-14T18:16:48.000000Z\",\"updated_at\":\"2022-12-14T18:16:48.000000Z\",\"restaurant_id\":1,\"status\":1}",
    "{\"id\":4,\"name\":\"Additional Fries\",\"price\":14,\"created_at\":\"2022-12-14T18:17:48.000000Z\",\"updated_at\":\"2022-12-14T18:17:48.000000Z\",\"restaurant_id\":1,\"status\":1}"
  ],
  "product": "1",
  "type": "product",
  "quantity": "1",
  "purchase_type": "addtocart",
  "_token": "SNkipeuJwfn58IWpFYWNRo9Fx1nGzJnwGXENaLR0"
}

当前使用的解析代码

$addons = [];
foreach($request->addon as $addon){
    array_push($addons,json_decode($addon));
}

return $addons;

更高效的替代方案

1. 使用array_map函数(一行代码搞定)

直接用array_map遍历数组并解析每个JSON字符串,代码更简洁:

$addons = array_map('json_decode', $request->addon);

如果需要将解析结果转为关联数组而非对象,加上JSON_OBJECT_AS_ARRAY参数:

$addons = array_map(fn($item) => json_decode($item, true), $request->addon);

2. 利用Laravel集合处理(更优雅)

Laravel的请求对象支持直接转为集合,用集合的map方法处理:

$addons = collect($request->addon)->map(fn($item) => json_decode($item))->toArray();

同样,要关联数组的话:

$addons = collect($request->addon)->map(fn($item) => json_decode($item, true))->toArray();

3. 优化前端传参(更安全高效的根本方案)

上面的方法都是优化解析步骤,但其实可以从源头优化:不要传递完整的JSON字符串,只传附加项的id即可,后端通过ID从数据库查询对应的附加项信息,这样既避免了前端篡改价格等敏感数据的风险,也减少了传输数据量:

  • 前端修改value为item.id:
<input type="checkbox" id="addon${i}" class="addonCheck" name="addon[]" value="${item.id}" data-price="${item.price}">
  • 后端直接查询:
// 假设附加项模型为Addon
$addons = \App\Models\Addon::whereIn('id', $request->addon)->get();

内容的提问来源于stack exchange,提问作者Hammad Anwar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:27:52