В моем сценарии список картин находится в столбце в формате json. Список картин содержит имя файла, имя картины и количество просмотров. Я хочу удалить картину в списке. Но мне не удалось. Вот мои коды:
$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...
Не могли бы вы помочь мне?
У вас нет объектов с ключами в строке 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]
Других решений пока нет …