array_diff似乎不适合我

时间:2015-02-15 23:45:07

标签: php arrays array-difference

我从用户帐户中提取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中不存在数组2,则array_diff将仅显示数组1中的值?

我是否有任何理由说明我在排除数组中设置的值是否未从主数组中删除?

1 个答案:

答案 0 :(得分:0)

您目前正在做的是从具有该YouTube ID的视频中排除id键/值,而不是从$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
}