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

PHP将多个对象数组写入JSON文件仅存最后一条如何解决

问题原因

你在循环内部直接调用file_put_contents写入文件,该函数默认采用覆盖写入逻辑,每次执行都会清空文件原有内容,再写入当前循环生成的单条产品数据。等6次循环全部执行完,文件里自然只会留下最后一次写入的对象,和你遇到的现象完全吻合。

修复方案

不要在循环内做单条数据的编码、写入操作,先初始化一个空的总数组存储所有产品数据,每次循环把当前解析到的产品追加到总数组中,等所有循环跑完,再把完整的总数组编码为JSON一次性写入文件即可。
修正后的完整代码:

// 初始化存储所有产品的总数组
$productList = [];

foreach($crawler as $node) {
    $title = $node->filter('h3')->text();
    $img = $node->filter('img')->attr('src');
    $color = $node->filter('div.my-4 div.flex div.px-2 span')->attr('data-colour');
    $capacity = $node->filter('span.product-capacity')->text();
    $availibity = $node->filter('div.text-sm')->text();
    $shippingText = $node->filter('div.bg-white > div')->last()->text();
    $shippingDate = $node->filter('div.bg-white > div')->last()->text();

    $productItem = [
        'title' => $title,
        'price' => 12,
        'imageUrl'=> 'https://www.magpiehq.com/developer-challenge/smartphones/'.$img,
        'capacityMB' => $capacity,
        'colour' => $color,
        'availabilityText' => $availibity,
        'shippingText' =>$shippingText,
        'shippingDate' =>$shippingDate
    ];

    // 将当前产品追加到总列表,不在循环内执行文件写入
    $productList[] = $productItem;
}

// 所有数据收集完成后,一次性编码写入JSON文件
$jsonContent = json_encode($productList, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
file_put_contents("output.json", $jsonContent);
补充说明
  • 如果你有特殊场景必须在循环内逐次写入,可以给file_put_contents传入第三个参数FILE_APPEND开启追加写入模式,但这种方式需要手动拼接JSON数组的首尾括号、元素间的逗号分隔符,很容易生成格式不合法的JSON文件,非必要不推荐使用。
  • json_encode传入的JSON_PRETTY_PRINT参数是用来格式化输出缩进、方便阅读JSON内容,JSON_UNESCAPED_UNICODE是避免中文被转义为Unicode编码,可根据自身需求选择是否保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:36:27