2014-03-06 48 views
0

存在,否則它添加我有一個包含以下內容的JSON文件:更新JSON值,如果在PHP

{"faqitem": [{ "id": "faq1", "question": "Question 1"}]} 

我試圖做兩件事情。如果它存在,則更新一個特定值;如果不存在,則更新一個新值。

目前,我能夠更新文件,但它只是不斷增加新的值,如果它已經存在,永遠不會更新。

$faqpage = 'includes/faq.json'; 

$file = file_get_contents($faqpage);  
$obj = json_decode($file); 

$newdata['id'] = "faq2"; 
$newdata['question'] = "This is the second question"; 

foreach($obj->faqitem as $key => $val) { 
    echo "IDS " . $val->id . " = " . $newdata['id'] . "<br/>\n"; 
    if ($val->id == $newdata['id']) { 
    $val->question = $newdata['question']; 
    echo $val->id . "<br/>match<br/>"; 
    } else { 
     $newstuff = new stdClass; 
    $newstuff->id = $newdata['id']; 
    $newstuff->question = $newdata['question'];  
    array_push($obj->faqitem, $newstuff); 
    echo "<br/>no match<br/>"; 
    } 
} 

echo json_encode($obj); 

$fh = fopen($faqpage, 'w') or die ("can't open file"); 
//okay now let's open our file to prepare it to write 
fwrite($fh, json_encode($obj)); 
fclose($fh); 

這裏是重複的對象ID輸出例如:

{"faqitem":[{"id":"faq1","question":"Question 1"},{"id":"faq2","question":"This is the updated question"},{"id":"faq2","question":"This is the updated question"}]} 
+1

嘗試使用 「按引用」 像'的foreach($ obj-> faqitem爲$鍵=>&$ VAL){' – djot

+0

這沒有什麼區別,我仍然在文件中得到重複值。 '{「faqitem」:[{「id」:「faq1」,「question」:「Question 1」},{「id」:「faq2」,「question」:「This is the updated question」 {「id」:「faq2」,「question」:「這是更新後的問題」}]} – plumwd

+0

@djot:爲了什麼? ... – zerkms

回答

1

你的問題是,你的邏輯是不正確。在第一次迭代中,ID不匹配,所以​​將被添加。在第二次迭代中,ID匹配和項目將被更新 - 但是等待。我們剛剛在之前的迭代中添加了這個項目!因此,你的循環部分應該看起來像這樣:

... 
$exists = false; 
foreach($obj->faqitem as $key => $val) 
{ 
    // update if exists 
    if($val->id == $newdata['id']) { 
     $val->question = $newdata['question']; 
     $exists = true; 
    } 
} 

// add new if not exists 
if(!$exists) { 
    $newstuff = new stdClass; 
    $newstuff->id = $newdata['id']; 
    $newstuff->question = $newdata['question'];  
    array_push($obj->faqitem, $newstuff); 
} 
... 
+0

美麗,這是完全正確的。感謝您的幫助。 – plumwd

0

所以把它的整個JSON方面。這只是序列化。想想如何使數據結構看起來像你想要的。考慮一下你的數據結構。對我來說,它可能不是您的目的的最佳結構,也許您需要您的id作爲查找鍵可用,所以當您將一個項目添加到數據結構時,您可以使用該id鍵創建一個新值或覆蓋該鍵的值。

如果數據被結構化,如:

{"faqitem": 
    { 
     "faq1": "Faq content", 
     "faq2": "Faq 2 content" 
    } 
} 

然後您的代碼的代碼是簡單:

$ faqpage = '包括/ faq.json';

$file = file_get_contents($faqpage);  
$obj = json_decode($file); 

$newdata['id'] = "faq2"; 
$newdata['question'] = "This is the second question"; 

$obj->faqitem->{$newdata['id']} = $newdata['question']; 

echo json_encode($obj); 

$fh = fopen($faqpage, 'w') or die ("can't open file"); 
//okay now let's open our file to prepare it to write 
fwrite($fh, json_encode($obj)); 
fclose($fh);