1

Gdata API を使用して、YouTube のビデオとコメントを取得しています。応答は XML であり、その中に配列が含まれています。

動画 ID とコメントの場合、XML レスポンスは異なります。たとえば、配列 ID をビデオ ID 配列として取得し、1 つの ID に対して配列内の 1 つまたは複数のコメントを取得しています。

動画 ID とコメントの配列は次のとおりです。

foreach ($array as $entry) 
{
    $videoid = basename($entry);
    $video[] = $videoid;

    $logger->info('Response From Youtube:videoid=>' . $videoid);
}

$this->view->videoid = $video;

$author   = array();
$content  = array();
$arraycnt = array();

foreach ($video as $id)
{
    $comment = "http://gdata.youtube.com/feeds/api/videos/".$id."/comments";
    $sxml1   = simplexml_load_file($comment);
    $entries = $sxml1->entry;

    foreach ($entries as $a)
    {
        $author[]  = $a->author->name;
        $content[] = $a->content; 
    }
}

そして、特定のビューは次のとおりです。

    <table>
   <tr>
            <td>
                <?php
                for($i=0;$i<$length;$i++)
                {
                ?> 
                <embed

                width="420" height="345"
                src="http://www.youtube.com/v/<?php echo $videoid[$i];?>"
                type="application/x-shockwave-flash">
            </embed>
            <?php
            }
            ?>
        </td>

        <td>
            <?php   
            foreach($content as $cont) 
            {
            ?>
            <p>Comment:<?php echo $cont;?></p>
            <?php 
            }
            ?>
        </td>
        <td>
            <?php   
            foreach($author as $auth) 
            {
            ?>
            <p>Commented By:<?php echo $auth;?></p>
            <?php 
            }
            ?>
        </td>
    </tr>
</table>

次のように、ビューにビデオとコメントを表示するにはどうすればよいですか。

ビデオA1 コメントA1 コメントA2

動画B1 コメントB1 コメントB2 コメントB3

4

2 に答える 2

0

ビデオの ID を配列に保持でき$authorます$content

foreach ($video as $id)
{
  foreach ($entries as $a)
  {
    $author[$id][]  = $a->author->name;
    $content[$id][] = $a->content; 
  }
}

したがって、特定のビデオ ID からコメントの作成者を取得できます。

foreach ($video as $id)
{
  echo $id;
  foreach($author[$id] as $auth) {
    echo ' ', $auth;
  }
}

コメントの内容も同様です。

もちろん、コメントの作成者とコンテンツの配列を 1 つだけにしたい場合は、このソリューションを拡張できますが、ロジックは同じままです。

于 2013-09-04T05:57:22.990 に答える
0

ここで実際に得られるのは、最初に動画を反復処理し、次に各動画ごとにコメントを反復処理することです。

つまり、レベル 1: ビデオ、レベル 2: コメントのネストされたイテレーションがあります。

前にコメントしたように、多次元配列でそのように反復できるデータを持つことができるデータ構造を作成できます。次の例では、ここで 2 つの Youtube ビデオを見てみましょう。

  1. -FRm3VPhseI: The Clean Code Talks - 「グローバル ステートとシングルトン」
  2. RlfLCWKxHJ0: きれいなコードについて語る - 物事を探すな!

したがって、すべてのコメントを含むこれら 2 つのビデオに対して多次元配列を作成する場合は、次の形式を選択できます。

$videos = array(
    '-FRm3VPhseI' => array(
        'id'       => '-FRm3VPhseI',
        'title'    => 'The Clean Code Talks - "Global State and Singletons"',
        'href'     => 'http://www.youtube.com/watch?v=-FRm3VPhseI&feature=youtube_gdata',
        'comments' => array(
            array(
                'author'  => 'Nelson ThePrimate',
                'content' => 'There is a cost for r...',
            ),
            array(
                'author'  => 'dennisdegreef',
                'content' => 'That is also a global...',
            ),
            array(
                'author'  => 'MorleyCode',
                'content' => 'State is unavoidable,...',
            ),

            // ...

            array(
                'author'  => 'Jacob Jensen',
                'content' => 'I don\'t quite underst...',
            ),
            array(
                'author'  => 'unity20000',
                'content' => 'Testing is not the on...',
            ),
            array(
                'author'  => 'drummist180',
                'content' => 'Turing machine > line...',
            ),
        ),
    ),
    'RlfLCWKxHJ0' => array(
        'id'       => 'RlfLCWKxHJ0',
        'title'    => 'The Clean Code Talks - Don\'t Look For Things!',
        'href'     => 'http://www.youtube.com/watch?v=RlfLCWKxHJ0&feature=youtube_gdata',
        'comments' =>
        array(
            array(
                'author'  => 'Nikolai Paul',
                'content' => 'this guy sometimes so...',
            ),
            array(
                'author'  => 'Madrid Softwaree',
                'content' => 'Learn Selenium , QTP ...',
            ),
            array(
                'author'  => 'Roger Keulen',
                'content' => 'Di: Great as a FXCop ...',
            ),

            // ...

            array(
                'author'  => 'michaeldeng1981',
                'content' => 'if I do outsourcing p...',
            ),
            array(
                'author'  => 'Rico Lelina',
                'content' => 'How about loggers? Is...',
            ),
            array(
                'author'  => 'twistedbydsign99',
                'content' => '11:55 it should defin...',
            ),
        ),
    ),
);

最初に Youtube ID によってキー/インデックス付けされたすべての動画が含まれ、次にすべてのコメントが含まれます。これを出力するには、2 つの foreach 句をネストするだけです。

foreach ($videos as $videoId => $video)
{
    printf("%s: %s\n", $videoId, $video['title']);

    printf("  Comments (%d):\n", count($video['comments']));

    foreach ($video['comments'] as $i => $comment)
    {
        printf("    #%d %s: %s\n", $i + 1, $comment['author'], $comment['content']);
    }

    echo "\n";
}

次の出力が作成されます。

-FRm3VPhseI: The Clean Code Talks - "Global State and Singletons"
  Comments (6):
    #1 Nelson ThePrimate: There is a cost for r...
    #2 dennisdegreef: That is also a global...
    #3 MorleyCode: State is unavoidable,...
    #4 Jacob Jensen: I don't quite underst...
    #5 unity20000: Testing is not the on...
    #6 drummist180: Turing machine > line...

RlfLCWKxHJ0: The Clean Code Talks - Don't Look For Things!
  Comments (6):
    #1 Nikolai Paul: this guy sometimes so...
    #2 Madrid Softwaree: Learn Selenium , QTP ...
    #3 Roger Keulen: Di: Great as a FXCop ...
    #4 michaeldeng1981: if I do outsourcing p...
    #5 Rico Lelina: How about loggers? Is...
    #6 twistedbydsign99: 11:55 it should defin...

この出力では、サンプル配列のコメントの量を減らしたため、コメントの数は毎回 6 つに制限されていることに注意してください。次に、ネストされた多次元配列の構造がネストされたforeach節でどのように読み取られるかを詳しく比較します。外側の foreach はビデオを読み取り、内側の foreach はコメントを読み取ります。

このところで。その配列の構築と同じですが、2 つのネストされた反復でも同様に機能します。これをより簡単にするために、最初にキャッシュ変数といくつかのヘルパー関数を作成します。

$gdataFetchCache = [];

$gdataFetch = function ($url) use (&$gdataFetchCache)
{
    if (!isset($gdataFetchCache[$url]))
    {
        $gdataFetchCache[$url] = simplexml_load_file($url);
    }
    return $gdataFetchCache[$url];
};

$gdataNamed = function ($pattern) use ($gdataFetch)
{
    return function ($value) use ($pattern, $gdataFetch)
    {
        return $gdataFetch(sprintf($pattern, $value));
    };
};


$ytVideo    = $gdataNamed('http://gdata.youtube.com/feeds/api/videos/%s');
$ytComments = $gdataNamed('http://gdata.youtube.com/feeds/api/videos/%s/comments');

これらの関数を使用すると、ネストされた foreach-es 内で Youtube データをより簡単に取得できます。

$videoIds = ['-FRm3VPhseI', 'RlfLCWKxHJ0'];

$videos = [];

foreach ($videoIds as $videoId)
{
    $video = $ytVideo($videoId);

    $videoArray = [
        'id'       => (string)$videoId,
        'title'    => (string)$video->title,
        'href'     => (string)$video->link['href'],
        'comments' => [],
    ];

    $videos[$videoId] = $videoArray;

    foreach ($ytComments($videoId)->entry as $comment)
    {
        $videos[$videoId]['comments'][] = [
            'author'  => (string)$comment->author->name,
            'content' => (string)$comment->content,
        ];
    }
}

もう一度よく比較すると、出力コードと同じ構造になっています。

これは、カウントが事前にわからない多次元配列を読み取って作成する方法です。反復することで、1 つの要素のコードを作成しますが、要素の数だけコードを使用します。

これはネストされた状態でも機能します。

于 2013-09-04T07:01:22.003 に答える