2014-10-26 36 views
1

在我的場景中,繪畫列表位於json格式的列中。繪畫列表包含文件名,繪畫名稱和查看次數。我想刪除列表中的一幅畫。但我沒有管理。這裏是我的代碼:獲取PHP中數組的差異

$paintings = '[["24ef9-70076-4358c-48386.jpg","La Donna Gravida","649"],["a7972-065a9-4c0f9-723d1.jpg","Madonna and Child with the Book","1254"],["b054c-df208-0f600-e884e.jpg","Madonna del Granduca","1457"]]'; 
$painting = 'a7972-065a9-4c0f9-723d1.jpg'; 
$difference = array_diff((array)json_decode($paintings), (array)$painting); 
echo json_encode(array_values($difference)); 

我想達到以下結論:[["24ef9-70076-4358c-48386.jpg","La Donna Gravida","649"],["b054c-df208-0f600-e884e.jpg","Madonna del Granduca","1457"]]但我得到這樣的錯誤:Notice: Array to string conversion in...你能幫助我嗎?

+0

'(array)json_decode($ paintings)'不會創建一個關聯數組,因爲您原本沒有包含json字符串中的鍵的對象。 – Cheery 2014-10-26 19:33:13

+0

警告'$ paintings'是一個數組數組,'array_diff'只接受一維數組 – 2014-10-26 19:34:29

+0

問題從這裏開始:'(array)$ painting'。 '$ painting'是一個字符串,試圖將它轉換爲一個數組沒有什麼意義(它給了你提及的警告)。 – arkascha 2014-10-26 19:34:30

回答

2

您在json字符串中沒有包含鍵的對象,因此您通過解碼創建的數組不會與鍵關聯。下面顯示瞭解決您的問題的一種可能方法(直接向前)。

$out = array(); 
foreach(json_decode($paintings, true) as $p) 
    if (!in_array($painting, $p)) 
    $out[] = $p; 

echo json_encode(array_values($out)); 

另一種方式

$out = array_filter(json_decode($paintings, true), function($el) use($painting) { 
    return !in_array($painting, $el); 
}); 

echo json_encode(array_values($out)); 

的原因是因爲["a7972-065a9-4c0f9-723d1.jpg","Madonna and Child with the Book","1254"]不符合項或值a7972-065a9-4c0f9-723d1.jpg的元素 - 這是另一個數組,你必須在整個子查詢任一值的存在陣列或只是其第一個元素。在這種情況下,!in_array($painting, $el)可以替換爲$painting != $el[0]

+0

非常感謝。我注意到。這是一個很好的解決方案,比如藥丸。 – 2014-10-26 20:47:40