array_diff, похоже, не работает для меня

Я вытаскиваю поток видео YouTube из учетной записи пользователя, которые затем сохраняются в массиве.

Меня попросили скрыть определенные видео из массива, поэтому я подумал, что могу сделать это, используя array_diff и создать массив, содержащий идентификаторы видео, которые я хочу исключить.

$return = array();
foreach ($xml->entry as $video) {
$vid = array();
$vid['id'] = substr($video->id,42);
$vid['title'] = $video->title;
$vid['date'] = $video->published;
$media = $video->children('http://search.yahoo.com/mrss/');
$yt = $media->children('http://gdata.youtube.com/schemas/2007');
$attrs = $yt->duration->attributes();
$vid['length'] = $attrs['seconds'];
$attrs = $media->group->thumbnail[0]->attributes();
$vid['thumb'] = $attrs['url'];
$yt = $video->children('http://gdata.youtube.com/schemas/2007');
$attrs = $yt->statistics->attributes();
$vid['views'] = $attrs['viewCount'];
array_push($return, $vid);
}

foreach($return as $video) {
$exclude = array('id' => 'zu8xcrGzxQk'); // Add YouTube IDs to remove from feed
$video = array_diff($video, $exclude);

Но затем со временем я просматриваю страницу, видео с идентификатором в массиве exclude все еще показывается.

Правильно ли я думаю, что array_diff будет показывать только значения из массива 1, если их нет в массиве 2?

Есть ли причина, по которой значение, которое я установил в массиве exclude, не удаляется из основного массива?

-1

Решение

То, что вы в настоящее время делаете, исключает id ключ / значение из видео с идентификатором YouTube, вы не удаляете эти видео из $return,

Удалить видео с заданным id вам нужно запустить операцию на $return Вы можете сделать это с array_filter, array_diff_key или отфильтровывая их в начальном цикле.

С помощью array_filter

$filter = array('zu8xcrGzxQk', /* other ids */);
$return = array_filter($return, function ($a) use ($filter) {
return !in_array($a['id'], $filter);
});

С помощью array_diff_key

Для этого вам нужно сделать ключи $return идентификаторы YT:

foreach ($xml->entry as $video) {
// your old loop code
// ...

// then instead of array_push you do
$return[$vid['id']] = $vid;
}

// now you can do your diff against the keys
$filter = array('zu8xcrGzxQk', /* other ids */);
$exclude = array_combine($filter, $filter);
$return = array_diff_key($return, $exclude);

Вместо этого фильтрация в вашем начальном цикле

$filter = array('zu8xcrGzxQk', /* other ids */);
foreach ($xml->entry as $video) {
$id = substr($video->id,42);
if (in_array($id, $filter)) {
continue;
}
// the rest of your original loop code
}
0

Другие решения

Других решений пока нет …