array_diff 似乎对我不起作用

array_diff doesn't seem to be working for me

我正在从一个用户帐户中提取 YouTube 视频供稿,然后将其保存在一个数组中。

我被要求从数组中隐藏某些视频,所以我想我可以使用 array_diff 并创建一个包含我要排除的视频 ID 的数组来做到这一点。

$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);

但后来超时我查看页面,排除数组中ID的视频仍在显示。

我的想法是否正确,如果数组 2 中不存在数组 1 中的值,array_diff 只会显示它们?

是否有任何原因导致我在排除数组中设置的值没有从主数组中删除?

您目前正在做的是从具有该 youtube id 的视频中排除 id key/value,而不是从 $return.

中删除这些视频

要删除给定 id 的视频,您需要对 $return 执行 运行 操作,您可以使用 array_filterarray_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 id 的密钥:

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
}