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_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 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
}
我正在从一个用户帐户中提取 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_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 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
}