2012-04-11 11 views
0

私はGoogleのYouTube APIで遊んでいるので、ユーザーからのすべてのサブスクリプションを返したいと思います。
私はサブスクリプション(最大50)を取得し、ユーザーが50を超えるサブスクリプションを持っている場合、より多くを得るためにこの関数をビルドしました。自分自身を呼び出す関数から配列をマージする

しかし、私はどのように各関数呼び出しからの配列をマージするか分かりません。 (最後のwhileループを参照してください)。
新しい配列は古い配列を上書きするだけですが、配列をメイン配列に追加して返してみましたが、配列自体が配列になります。

Array 
(
    [0] => Array 
     (
      [channelName] => break 
      [channelLink] => https://www.youtube.com/channel/UClmmbesFjIzJAp8NQCtt8dQ 
     ) 

    [1] => Array 
     (
      [channelName] => kn0thing 
      [channelLink] => https://www.youtube.com/channel/UClmmbesFjIzJAp8NQCtt8dQ 
     ) 

    [2] => Array 
     (
      [channelName] => EpicMealTime 
      [channelLink] => https://www.youtube.com/channel/UClmmbesFjIzJAp8NQCtt8dQ 
     ) 
) 

だから、問題はwhileループです:

foreachループは、次のようになります配列を返します。何か考えましたか?

$subscription = getUserSubscriptions($username, $startIndex);

これは、返される結果とサブスクリプションの配列を上書きしているように見えるので、あなただけの最後になるだろう:

// Get an array with videos from a certain user 
function getUserSubscriptions($username = false, $startIndex = 1, $maxResults = 50) { 
    // if username is not set 
    if(!$username) return false; 

    // get users 50 first subscriptions 
    // Use start-index to get the rest 
    $ch = curl_init('https://gdata.youtube.com/feeds/api/users/'.$username.'/subscriptions?v=2&max-results='.$maxResults.'&start-index='.$startIndex); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $subscriptionsXML = curl_exec($ch); 
    curl_close($ch); 

    // convert xml to array 
    $subscriptionsArray = XMLtoArray($subscriptionsXML); 

    // Ge total number of subscriptions 
    $totalNumberOfSubscriptions = $subscriptionsArray['FEED']['OPENSEARCH:TOTALRESULTS']; 

    // Parse array and clean it up 
    $s = 0; 
    $l = 0; 
    foreach($subscriptionsArray['FEED']['ENTRY'] as $subscriptionArray) { 

     // get link 
     foreach($subscriptionArray['LINK'] as $channelLinks) { 
      $channelLinkArray[$l] = $channelLinks; 
      $l++; 
     } 
     // save all into a more beautiful array and return it 
     $subscription[$s]['channelName'] = $subscriptionArray['YT:USERNAME']['DISPLAY']; 
     $subscription[$s]['channelLink'] = $channelLinkArray[1]['HREF']; 
     $s++; 
    } 

    // if we did not get all subscriptions, call the function again 
    // but this time increase the startIndex 
    while($totalNumberOfSubscriptions >= $startIndex) { 
     $startIndex = $startIndex+$maxResults; 
     $subscription = getUserSubscriptions($username, $startIndex); 
    } 
    return $subscription; 
} 

答えて

2

問題は、再帰呼び出しを作っているときのように見えますアレイが構築された。代わりに、配列をマージしようとする必要があります

$subscription = array_merge($subscription, getUserSubscriptions($username, $startIndex));

すべてのインデックスが数値であればこれは配列の末尾にすべての要素を追加します。参照:http://php.net/manual/en/function.array-merge.php

+0

良いアイデア。しかし、何かがnullを返し、array_mergeがエラーを返すようです。 – Patrik

+1

ああ、条件が満たされない場合に 'foreach'の前に$ subscriptionを空の配列として初期化する必要があります。あなたの関数の先頭に '$ subscription = array();'を置いてみてください。 – Dan

+0

すごく元気です。できます!ありがとう:) – Patrik

関連する問題