2012-04-11 4 views
0

그래서 Google Googles 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는 루프는 다음과 같습니다 배열을 반환합니다. 어떤 아이디어 있니?

// 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 = getUserSubscriptions($username, $startIndex);

배열 내장. 대신 당신은 배열을 병합하려고한다 : 모든 인덱스 숫자하면이 배열의 마지막에 모든 요소를 ​​추가합니다

$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