2014-10-26 2 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

'(массив) json_decode ($ painting)' не создает ассоциативный массив, так как у вас нет первоначально объектов с ключами в json-строке. – Cheery

+0

Предупреждение '$ painting' - массив массивов, а' array_diff' принимает только один размерный массив. –

+0

. Проблема начинается здесь: '(array) $ painting'. '$ painting' - это строка, и нет смысла пытаться преобразовать ее в массив (который дает вам предупреждение, которое вы упоминаете). – arkascha

ответ

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 - это еще один массив, и вы должны проверить, либо существование значения во всех подразделах -array или только его первый элемент. В этом случае !in_array($painting, $el) может быть заменен на $painting != $el[0]

+0

Большое спасибо. Я заметил. Это хорошее решение, такое как таблетка. –