2016-01-24 80 views
2

我遍歷一個目錄,並在其合併JSON檔案。但它並不像我想要的那樣工作。迭代3個文件後得到的數組只是最後一個文件。一路上似乎只是覆蓋了以前的文件。雖然我不確定。另外,我想刪除某些條目的行,但如果合併至少能夠起作用,我會很高興。提前合併JSON文件一起在PHP

<?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

每個文件內容都以'['開頭,還是以'{'開頭? – trincot

+0

@trincot它始於{ – Kobsondasusa

+0

然後請認識到,如果這些數組中的兩個共享密鑰,則第一個密鑰將被最後一個密鑰覆蓋。這是'array_merge'的效果。在極端情況下,如果兩個數組具有完全相同的鍵(但具有不同的值),則只會留下最後一個數組。你可以檢查是否是這種情況? – trincot

回答

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)); 

輸出:

{ 「一」:100, 「B」:200}

所以,第一個數組的值會丟失。

有幾種解決方案,但是它依賴於它導致你想獲得。例如如果你想獲得這樣的:

{ 「一」:1,100], 「B」:[2 200]}

然後使用功能array_merge_recursive代替array_merge

如果您希望得到這樣的:

[{ 「一」:1, 「B」:2},{ 「一」:100, 「B」:200}]

然後用這個代碼:

$result[] = $a1; 
$result[] = $a2; 

在你的原代碼,這最後的解決辦法是這樣的:

$result[] = json_decode($json,true); 
foreach ($dir as $fileinfo) { 
    // ... 
     $result[] = $current; 
    // ... 
} 
+0

非常感謝您的快速幫助!我可以給你一些建議,作爲一個好用戶還是什麼?對所有這些都很新鮮 – Kobsondasusa

+0

一旦你獲得了5點以上的聲望,你就可以得到一個答案(使用向上箭頭)。所以,如果你想要,得到這個聲譽,並回來:-) – trincot

+0

你真的做到了。謝謝,祝你好運。 – trincot