PHP:按条件从循环中的其他数组中获取数组值
有两个数组,一个包含播放列表列表,第二个包含它们的封面 带盖阵列:PHP:按条件从循环中的其他数组中获取数组值,php,arrays,Php,Arrays,有两个数组,一个包含播放列表列表,第二个包含它们的封面 带盖阵列: Array ( [0] => Array ( [id] => 110 [playlist_id] => 131 [video_key] => Jz4YS6oz [user] => 20 [date] => 2019-08-09 12:21:40
Array
(
[0] => Array
(
[id] => 110
[playlist_id] => 131
[video_key] => Jz4YS6oz
[user] => 20
[date] => 2019-08-09 12:21:40
)
[1] => Array
(
[id] => 109
[playlist_id] => 128
[video_key] => KoLwjBed
[user] => 20
[date] => 2019-08-09 11:37:50
)
)
播放列表阵列:
Array
(
[0] => Array
(
[playlist_id] => 132
[playlist_title] => 222
[user] => 20
[date] => 2019-08-09 12:22:09
[cover] =>
[access] => 1
[playlist_videos] => 0
[playlist_featured] => 0
)
[1] => Array
(
[playlist_id] => 131
[playlist_title] => 111
[user] => 20
[date] => 2019-08-09 11:28:47
[cover] =>
[access] => 1
[playlist_videos] => 2
[playlist_featured] => 0
)
[2] => Array
(
[playlist_id] => 128
[playlist_title] => 333
[user] => 20
[date] => 2019-08-08 21:16:55
[cover] =>
[access] => 1
[playlist_videos] => 2
[playlist_featured] => 0
)
)
从代码中可以看出,两个数组都包含键[playlist\u id]。必须以某种方式迭代第二个数组,以便键[cover]从第一个数组中获取值[video_key],并且键[playlist_id]匹配,如果第二个数组中有播放列表,但第一个数组没有覆盖,则键[cover]必须包含null
我试过这个varinat
foreach($playlists as $pls){
foreach($covers as $cover){
if($cover['playlist_id'] == $pls['playlist_id']){
$output['list'][] = array(
'id' => $pls['playlist_id'],
'title' => $pls['playlist_title'],
'videos' => $pls['playlist_videos'],
'cover' => (isset($cover) && $cover['playlist_id'] == $pls['playlist_id']) ? $cover['video_key'] : NULL,
'date' => strtotime($pls['date']) * 1000,
'access' => $pls['access'],
);
}
}
}
看起来一切正常,但如果播放列表没有封面,则不会显示播放列表。如果在第二个循环中删除检查,那么在最后一个数组中,将有许多元素等于第一个和第二个数组的乘积。例如,播放列表3和封面2,在最终的数组中将有6个元素,其中一些元素将重复…更新循环。这应该起作用:
foreach($pls形式的播放列表){
$NewPlayList=数组(
'id'=>$pls['playlist\u id'],
'title'=>$pls['playlist\u title'],
“视频”=>$pls[“播放列表\视频”],
“日期”=>STROTIME($pls[“日期])*1000,
“访问”=>$pls[“访问”],
“cover”=>null
);
foreach($cover作为$cover){
如果(isset($cover['playlist\u id'])和($cover['playlist\u id']==$pls['playlist\u id'])){
$NewPlayList['cover']=$cover['video_key'];
}
}
$output['list'][]=$NewPlayList;
}
使用您可以轻松完成。使用$filter
范围,我们检查了第一个阵列的播放列表id
,并用第一个阵列的视频键
替换了第二个阵列的封面
示例:
$filter = array_column($first_array, 'video_key', 'playlist_id');
array_walk($second_array, function (&$val) use ($filter) {
if (isset($filter[$val['playlist_id']])) $val['cover'] = $filter[$val['playlist_id']];
else unset($val['cover']);
});
echo '<pre>', print_r($second_array);
$filter=array\u列($first\u array,'video\u key','playlist\u id');
数组遍历($second_数组,函数(&$val)使用($filter){
如果(设置($filter[$val['playlist\u id']))$val['cover']=$filter[$val['playlist\u id']);
其他未结算金额($val['cover']);
});
回显“”,打印(第二个数组);
您的内部foreach循环应该只确定当前播放列表是否有合适的封面。将当前播放列表添加到输出数组应该在内部foreach循环之后进行。这样,每个播放列表只会发生一次,但无论是否找到匹配的封面,每个播放列表都会发生一次。您可以显示示例代码吗?您的版本非常优雅,但如果没有封面,则不会显示播放列表。因此,如果
播放列表id
与$first\u array
不匹配,你想显示什么?你是说播放列表\u id?看,我们总共有三个播放列表和两个封面,如果有,你需要显示所有三个播放列表和封面。如果没有封面,那么播放列表[cover]=NULLOk,明白你的意思了。如果不存在匹配项,则要移除封盖
。对吗?更新的答案,请检查。
return array_map(function($playlist) {
$hasCover = array_filter($covers, function($c) use ($playlist){
return $c['playlist_id'] === $playlist['id'];
});
if (count($hasCover) > 0) {
return [
'id' => $playlist['playlist_id'],
'title' => $hasCover[0]['playlist_title'],
'videos' => $hasCover[0]['playlist_videos'],
'cover' => $hasCover[0]['playlist_videos']['cover'],
'date' => strtotime($hasCover[0]['playlist_videos']['date']) * 1000,
'access' => $hasCover[0]['playlist_videos']['access']
]
} else {
//playlist have no cover
return null;
}
} use ($covers));