在php中将json文件合并在一起

时间:2016-01-24 14:50:04

标签: php json

我遍历目录并合并其中的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);
?>

提前感谢您提供任何帮助

1 个答案:

答案 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;
    // ...
}