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
相关产品推荐
相关产品推荐

