2012-04-29 2 views
1

Facebook PHP SDK에서 반환 한 큰 배열을 통해 도움을 청합니다. 나는 사용자로부터 모든 게시물을 찾으려고 노력하고 있으며, 게시물이 '링크'키를 포함하고 있지 않은지 확인합니다. 나는 그것을 처리하기 위해 1MB 이상의 데이터를 복사하기 때문에이 크기의 배열에서 foreach 루프를 사용하는 것이 비효율적이라고 읽었습니다. 어떻게 정보를 효과적으로 통과해야합니까?큰 다차원 배열, PHP, Facebook API의 게시물 필터링

배열은 'x'를 각 게시물의 수이다이 같이 구성되어있다 :

Array 
(
    [data] => Array 
     (
      [x] => Array 
       (
        [from] => Array 
         (
          [name] => james 
         ) 

        [message] => Thanks for the great interview! 
        [link] => http://example.com/link.html 
        [description] => Description here 
        [etc] => Various other keys possible 
       ) 
     ) 
) 

그럼 내 현재 코드는 $ 피드는 페이스 북 API의 배열입니다 다음과 같습니다

for ($x=0, $y=0; $x<=1000, $y<=19; $x++) { 

    if (array_key_exists('james', $feed['data'][$x]['from']['name'])) { 

     if (!array_key_exists('link', $feed['data'][$x])) { 

      echo "<div>" . $feed['data'][$x]['message'] . "<hr>" . $feed['data'][$x]['description'] . "</div>"; 

      $y++; 
     }; 

    }; 

}; 

다양한 이터레이터에 대해 읽었지 만 어느 것을 사용해야할지 모르겠다! 조, 당신은 환호 나를 도울 수 있기를 바랍니다

답변

1

foreach는 성능에 대해 말하기 실제 사실 array_key_exists을 사용하여이 는 이럴 그것은 훨씬 더

foreach($feed['data'] as $post){ 
      if($post['from']['name']==='youruser'){ 
      //has user 
      } 
      if(isset($post['link'])){ 
      //has link 
      } 
}  

같은 년대 cillosis 방법 에 넣어 아닌 감각 그리고 더 빨리해야한다.

+0

고맙습니다. 그렇습니다. 제 논리를 설명하는 것이 었습니다. 매우 비효율적 인 코드라는 것을 알고 있습니다. foreach를 사용하고 나면 위의 기술을 사용하여 나중에 최적화합니다. 도와 주셔서 다시 한 번 감사드립니다! :) – Joe

1

당신은 큰 배열로 반복 처리를 실시 할 때 기본적으로이 값의 사본을 사용하기 때문에 foreach가 느릴 수 있다는 사실에 정확하고, 당신이 언급 한 것을 복사 할 수 좋아 메모리를 소비하고 약간의 시간을 소비합니다.

그러나 foreach를 사용하는 또 다른 방법은 입니다 (참조 번호).이 복사본은 복사본을 만들지 않습니다. 원래 값으로 작동합니다. 즉, 배열의 크기에 관계없이 다시 메모리에 저장되지 않습니다. 여기 shared by another StackOverflow user로 참조에 의한 의 foreach의 예는 다음과 같습니다

$a = array('hello', 'world'); 
$asRef =& $a; 
$ontime = 0; 
foreach($asRef as $i => $v) 
{ 
    if (!$ontime++) $a = array('hash', 'the cat'); 
    echo " $i: $v\n"; 
} 

당신은 C로 작성 꽤 빠르다 된 SPL에서 ArrayIterator을 사용할 수있는 옵션이 있습니다. 그것이 어떻게 작동하는지 그냥 빠른 예 :

// This would be your large facebook array 
$big_array = array(1,2,3,...,10000,10001); 

// Get the iterator object 
$array_iterator = new ArrayIterator($big_array); 

foreach($array_iterator as $item) 
{ 
    //Do something with $item here 
} 

나는 어떤 벤치마킹을하지했지만 나는 참조로 배열을 전달하고 아마 좋은 해결책이 될 것 ArrayIterator를 사용하여 상상.

+0

감사합니다 .- 코드를 간소화 할 때 이러한 기술을 구현할 것입니다. :) – Joe

-1

foreach가 항상 복사하지는 않습니다. 복사를 수행하면 반복되는 즉각적인 데이터 구조 만 복사합니다. 어떤 값도 복사하지 않습니다. 예를 들어, 100 개 서브 요소, 그때는 100 개의 키를 복사 배열 할 것이다 (만약 [X] 하나 약칭)하지만 값을 복사하지 않을 있었다 경우

foreach ($arr['data'] as $k => $v) .... 

를 않았다면 해당 키 점을 가리키며 값은 하위 배열/나무입니다. 내부적으로 포인터를 저장하고 복사하지 않고 서브 어레이의 메모리 주소를 가리 킵니다.

실제로 복사되는 데이터의 양이 거의 없기 때문에 아무 것도 할 필요가 없다고 생각합니다. foreach는 거의 항상 매우 빠릅니다 ...

훑어보고 싶다면 루프 전후에 memory_get_usage() 및 memory_get_peak_usage()을보십시오.

+0

확실한 점은 사이트에서 많은 트래픽을 처리하는 것이 더 효율적인 코드를 갖는 것이 더 낫다는 것입니까? 물론 – Joe

+0

. 그러나 개발자 시간의 분당받은 이익은 다른 기회와 비교할 때 매우 낮을 것입니다. – goat