PHP:如何在循环中将一个数组的值与另一个数组的值进行比较

时间:2019-02-16 12:17:02

标签: php

尝试实现以下功能。 有由用户自己创建的播放列表列表。如果用户已登录并且与歌曲位于播放器所在的同一页面上,则需要显示其自己的播放列表的列表,并显示该歌曲已在其播放列表中。

列出用户播放列表

Array
(
    [0] => stdClass Object
        (
            [playlist_id] => 1
            [title] => My firts playlist
            [user] => 20
            [date] => 2019-02-15 00:00:00
        )

    [1] => stdClass Object
        (
            [playlist_id] => 2
            [title] => My another playlist
            [user] => 20
            [date] => 2019-02-15 00:00:00
        )

    [2] => stdClass Object
        (
            [playlist_id] => 3
            [title] => My tested playlist
            [user] => 20
            [date] => 2019-02-15 00:00:00
        )

)

包含所有播放列表中所有用户歌曲的数组

Array
(
    [0] => stdClass Object
        (
            [id] => 5
            [playlist_id] => 2
            [song] => QhvUVlCt
            [user] => 20
            [date] => 2019-02-15 20:41:47
        )

    [1] => stdClass Object
        (
            [id] => 6
            [playlist_id] => 1
            [song] => QhvUVlCt
            [user] => 20
            [date] => 2019-02-16 13:17:11
        )

)

从第二个代码可以看出,标识符为“ QhvUVlCt”的歌曲在标识符为“ 20”的三个用户中的两个播放列表中。

在页面上仅显示播放列表并不难,我使用foreach周期

困难在于如何比较来自两个不同阵列的键。例如,在我的示例中,这首歌已经存在的两个播放列表(playlist_id = 1和playlist_id = 2),输出标记“已经添加到此播放列表”,其余标记(在我的示例中,输出playlist_id = 3) )显示标记为“添加到此播放列表”

仅输出播放列表:

<?php foreach($playlists as $playlist): ?>
    <a href="#" class="playlists__link" data-action="playlist" data-id="<?php echo $playlist->playlist_id; ?>">
        <strong span class="playlists__title">
            <span class="playlists__icon"><i class="fa fa-bars"></i></span>
            <?php echo $playlist->title; ?>
        </strong>
</a>
<?php endforeach; ?>

以及如何进行比较-我无法弄清楚

我将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我认为您应该使用$songs从第二个数组(array_column)中提取播放列表ID,例如:

$playlistIds = array_column($second_array, 'playlist_id');

它们遍历$playlists

foreach($playlists as $playlist):
    if (in_array($playlist->id, $playlistIds)) {
        // do one thing
    } else {
        // do another thing
    }
endforeach;

更新array_column:由于array_column可以从对象中提取列(不是真正的列,而是属性),自php7起,您可以使用简单的foreach

$playlistIds = [];
foreach ($second_array as $song) {
    $playlistIds[] = $song->playlist_id;
}

甚至更快版本也会是:

$playlistIds = [];
foreach ($second_array as $song) {
    // here you set `playlist_id` as key
    $playlistIds[$song->playlist_id] = true;
}

foreach($playlists as $playlist):
    // `isset` is faster than `in_array`
    if (isset($playlistIds[$playlist->id])) {
        // do one thing
    } else {
        // do another thing
    }
endforeach;

答案 1 :(得分:-1)

您可以尝试从此示例中实现逻辑:

<?php
$a1=array("a"=>"red","b"=>"green","c"=>"blue");
$a2=array("a"=>"red","c"=>"blue","d"=>"pink");
$result=array_diff_key($a1,$a2);
print_r($result);
?>

这将仅打印两个数组之间的差异。按照逻辑,您可以比较用户的播放列表并返回唯一的结果,并将其放在一个播放列表中,反之亦然。如果您希望用户收到错误消息,则表示您已将歌曲发布到播放列表中。