2016-09-05 6 views
0

指定したビデオのコメント作成者のアバターを取得する小さな関数があります。 YouTube API v3のcommentThreadsメソッドから返されたJSONデータをループします。このJSONデータ 'item'をこのforeachループ(PHP)で一度だけ表示する方法

唯一の問題は、著者が複数回コメントしたことがあることです。そのため、私の機能は複数回の作者のアバターを表示しています。私はそれを一度だけ表示し、次のアバターに表示したいと思います。

は、ここで私が言いたいの絵です: 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ループをチェックする巧妙な方法がありますか?

+0

質問は重複していますか?アバターが表示されているかどうかを確認しますか? –

+0

@CasparWylieアバターがまだ表示されているかどうかを判断するために何が行われますか。私は各アバターを1回だけ表示したいだけです。私はそれが表示されているかどうかを確認するのではなく、重複の事実を確認する方がいいでしょう。ありがとう! – anthonyCam

+0

それは表示されませんか?バックエンド(php)からデータ/アバターを出力しているので、配列内のすべてがページのロード時に出力されると仮定できますか? –

答えて

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

簡単な例ではなく、OPの実際のコードにあなたの答えを関連付ける方が便利でしょう – RiggsFolly

+1

fair-enough - 更新しました。 –

+0

@CasparWylieありがとう、私はこれを組み入れると私はあなたに戻ってきます。それは有り難いです。 – anthonyCam

0

ループ内で一意のインデックスを持つマルチ配列を試すことができます。

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

このように、配列内ではユニークな結果しか得られません。

+0

私が探していたものではありませんが、応答していただきありがとうございます。 – anthonyCam

+0

しかしそれは動作します。 3つの変数の代わりに、2つの値を持つ1つのマルチ配列。 – iliaz

関連する問題