
本文详解如何正确将循环生成的多个对象合并为一个 json 数组并一次性写入文件,避免因重复覆盖导致仅保存最后一个对象的问题。
本文详解如何正确将循环生成的多个对象合并为一个 json 数组并一次性写入文件,避免因重复覆盖导致仅保存最后一个对象的问题。
在 PHP 中,将多组结构化数据(如爬取的商品信息)写入 JSON 文件时,一个常见误区是:在循环体内反复调用 file_put_contents()。正如示例代码所示,每次迭代都执行 file_put_contents("output.json", $json),这会导致前一次写入的内容被完全覆盖,最终文件中仅保留最后一次迭代生成的单个对象——而非预期的 6 个对象组成的数组。
✅ 正确做法是:先在内存中累积所有对象,构建一个完整的关联数组(或索引数组),待循环结束后统一编码并写入文件。这样既能保证 JSON 格式合法(外层为数组),又可确保全部数据完整持久化。
以下是优化后的标准实现:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
<?php $products = []; // 初始化空数组,用于收集所有产品对象
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();
$availability = $node->filter('div.text-sm')->text();
$shippingText = $node->filter('div.bg-white > div')->last()->text();
$shippingDate = $node->filter('div.bg-white > div')->last()->text();
$productArray = [
'title' => $title,
'price' => 12,
'imageUrl' => 'https://www.magpiehq.com/developer-challenge/smartphones/' . $img,
'capacityMB' => $capacity,
'colour' => $color,
'availabilityText' => $availability,
'shippingText' => $shippingText,
'shippingDate' => $shippingDate
];
$products[] = $productArray; // 追加到总数组,而非覆盖
}
// ✅ 循环结束后一次性编码并写入
$jsonContent = json_encode($products, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
if (file_put_contents('output.json', $jsonContent) === false) {
throw new RuntimeException('Failed to write JSON file.');
}
echo "Successfully wrote " . count($products) . " products to output.json";
?>
? 关键注意事项:
-
不要在循环内写文件:
file_put_contents()默认覆盖模式(FILE_BINARY),无追加逻辑;若需追加,须显式传入FILE_APPEND标志,但此时无法生成合法 JSON(会得到多个独立 JSON 对象拼接,非标准数组格式)。 -
启用 JSON 可读性选项:添加
JSON_PRETTY_PRINT提升调试体验;JSON_UNESCAPED_UNICODE防止中文等 Unicode 字符被转义。 -
验证写入结果:建议检查
file_put_contents()返回值,确保写入成功;也可用json_last_error()辅助诊断编码失败原因。 -
内存考量:对于海量数据(如数万条记录),需评估内存占用,必要时考虑分批次处理或流式写入(如结合
fopen()+fwrite()手动构造 JSON 流),但绝大多数场景下累积数组方式简洁可靠。
遵循此模式,即可稳定、高效、合规地将多个对象导出为标准 JSON 数组文件,便于后续前端解析或 API 对接。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










