如何显示此JSON数据' item'在这个foreach循环中只有一次(PHP)

时间:2016-09-05 19:30:15

标签: php json foreach youtube duplicates

我有一个小功能,可以抓取评论作者在指定视频上的头像。它只是循环遍历YouTube API v3 commentThreads方法返回的JSON数据。

唯一的问题是,有时作者不止一次评论,所以我的功能不止一次地显示作者头像。我只想展示一次,然后展示给下一个化身。

这是我的意思的图片: enter image description here

目前我的功能如下:

function videoCommentAvatars($video) {
    // Parse YouTube video ID from the url
    if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $video, $match)) {
        $video_id = $match[1];
    }

    // Gather Video stats with YouTube API v3
    $api_key   = "API_KEY_HERE";
    $JSON      = file_get_contents('https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId='.$video_id.'&key='.$api_key);
    $json_data = json_decode($JSON, true);

    if (!empty($json_data)) {
        foreach ($json_data['items'] as $data) {
            // Create variables that hold info
            $author_name    = $data['snippet']['topLevelComment']['snippet']['authorDisplayName']; // Author Name
            $author_avatar  = $data['snippet']['topLevelComment']['snippet']['authorProfileImageUrl']; // Author Avatar
            $author_channel = $data['snippet']['topLevelComment']['snippet']['authorChannelUrl']; // Author Channel URL

            echo '<span class="comment-author-avatar">';
                echo '<a target="_blank" href="'.$author_channel.'" title="'.$author_name.'"><img width="50" alt="'.$author_name.'" class="comment-author-thumb-single" src="'.$author_avatar.'"></a>';
            echo '</span>';
        }
    }
}

一切正常,但无法检查是否已显示头像。我想过使用数组可能吗?将每个头像URL添加到阵列,并检查阵列以查看密钥是否存在。但对于看似更简单的事情来说,这似乎有些过分。有没有人有一种聪明的方法来检查foreach循环中的重复项?

2 个答案:

答案 0 :(得分:2)

要检查数组中的重复项,您有几个选项。首先,为了摆脱任何前循环,你可以使用array_unqiue($array),它将返回一个不重复它的值的数组。

或者,如果您确实需要初始访问循环中的所有值,并且如果存在重复则执行某些操作,您可以使用另一个数组作为记录,以查看它们是否出现多次。

$record = array();
foreach ($json_data['items'] as $data) {
    // Create variables that hold info
    $author_name    = $data['snippet']['topLevelComment']['snippet']['authorDisplayName']; // Author Name
    if(!in_array($author_name, $record)){

        $author_avatar  = $data['snippet']['topLevelComment']['snippet']['authorProfileImageUrl']; // Author Avatar
        $author_channel = $data['snippet']['topLevelComment']['snippet']['authorChannelUrl']; // Author Channel URL

        echo '<span class="comment-author-avatar">';
        echo '<a target="_blank" href="'.$author_channel.'" title="'.$author_name.'"><img width="50" alt="'.$author_name.'" class="comment-author-thumb-single" src="'.$author_avatar.'"></a>';
        echo '</span>';
        $record[] = $author_name;
    }
}

答案 1 :(得分:0)

您可以在循环中尝试使用唯一索引的多数组。

$author[$data['snippet'][...]['authorDisplayName']['avatar'] = $data['snippet'][...]['authorProfileImageUrl'];

所以数组中只有唯一的结果。