Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:按条件从循环中的其他数组中获取数组值_Php_Arrays - Fatal编程技术网

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