我遍历目录并合并其中的JSON文件。但它并不像我想要的那样完全奏效。迭代3个文件后得到的数组就是最后一个文件。它的某处似乎只是覆盖了以前的文件。我不确定在哪里。此外,我想删除包含某些条目的行,但如果合并至少可以工作,我会感到高兴。
<?php
$dir = new DirectoryIterator("path1");
$destination = "path2";
$json = file_get_contents($destination);
$result = json_decode($json,true);
foreach ($dir as $fileinfo) {
if (!$fileinfo->isDot()) {
$path = $dir -> getPathname();
$data = file_get_contents($path);
echo $data; //works as intended. Prints 3 different Arrays after eachother
$current = json_decode(file_get_contents($path),true);
$result = array_merge($result,$current);
}
}
$final = json_encode($result);
file_put_contents($destination,$final);
?>
提前感谢您提供任何帮助
答案 0 :(得分:1)
函数array_merge
具有此覆盖行为,如manual中所述:
如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个键。
这个效果可以用这个小例子说明:
$a1 = array("a" => 1, "b" => 2);
$a2 = array("a" => 100, "b" => 200);
$result = array_merge($a1, $a2);
print_r (json_encode($result));
输出:
{&#34;&#34;:100,&#34; B&#34;:200}
因此,第一个数组的值将丢失。
有几种解决方案,但这取决于您希望得到的结果。例如,如果你想得到这个:
{&#34; a&#34;:[1,100],&#34; b&#34;:[2,200]}
然后使用函数array_merge_recursive
代替array_merge
。
如果您愿意这样做:
[{&#34;&#34;:1,&#34; B&#34;:2},{&#34;&#34;:100,&#34; B&#34;:200 }]
然后使用此代码:
$result[] = $a1;
$result[] = $a2;
在原始代码中,最后一个解决方案如下所示:
$result[] = json_decode($json,true);
foreach ($dir as $fileinfo) {
// ...
$result[] = $current;
// ...
}