문제

그것은"와"앞으로는 동안 반복 배 PHP5.2?예를 들어,자주 사용 foreach 를 조작하는 데이터 배열에서:

foreach($array as $object) {
  // do something
}

그러나 나이 종종 필요에 다음 요소를 통과하는 동안에 배열입니다.나는 알고를 사용할 수 있었다. for 루프 및 참조 다음 항목이 그것에 의하여 인덱스($array[$i+1]어),하지만 그것은 작동하지 않을 것에 대한 연관 배열입니다.가 우아한 솔루션을 제 문제에 대한 아마도 포함하는 SPL?

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 캐싱 레터 레이터 이 목적을 위해.

예는 다음과 같습니다.

$collection = new CachingIterator(
                  new ArrayIterator(
                      array('Cat', 'Dog', 'Elephant', 'Tiger', 'Shark')));

캐싱 레터 레이터는 항상 내부 반복자 뒤에있는 한 단계입니다.

var_dump( $collection->current() ); // null
var_dump( $collection->getInnerIterator()->current() ); // Cat

따라서 할 때 foreach ~ 위에 $collection, 내부 배열 계수의 현재 요소는 이미 다음 요소가되므로 다음을 살펴볼 수 있습니다.

foreach($collection as $animal) {
     echo "Current: $animal";
     if($collection->hasNext()) {
         echo " - Next:" . $collection->getInnerIterator()->current();
     }
     echo PHP_EOL;
 }

출력 :

Current: Cat - Next:Dog
Current: Dog - Next:Elephant
Current: Elephant - Next:Tiger
Current: Tiger - Next:Shark
Current: Shark

어떤 이유로 설명 할 수없는 이유로, 캐싱 레터 레이터는 항상 현재 요소를 문자열로 변환하려고 시도합니다. 객체 컬렉션을 반복하고 속성에 액세스 해야하는 경우 방법을 통과하십시오. CachingIterator::TOSTRING_USE_CURRENT 생성자의 두 번째 매개 변수로서.


사이드 노트에서 캐싱 레터 레이터는 지금까지 반복 한 모든 결과를 캐시하는 기능에서 이름을 얻습니다. 이것이 작동하기 위해서는 그것을 인스턴스화해야합니다. CachingIterator::FULL_CACHE 그런 다음 캐시 된 결과를 가져올 수 있습니다 getCache().

다른 팁

사용 array_keys.

$keys = array_keys($array);
for ($i = 0; $i < count($keys); $i++) {
    $cur = $array[$keys[$i]];
    $next = $array[$keys[$i+1]];
}

당신이 사용할 수있는 next 그리고 prev 배열을 반복합니다. current 현재 항목 값을 반환합니다 key 현재 키.

그래서 당신은 다음과 같은 일을 할 수 있습니다.

while (key($array) !== null) {
    next($array);
    if (key($array) === null) {
        // end of array
    } else {
        $nextItem = value($array);
    }
    prev($array);

    // …

    next($array);
}

나는 이것이 오래된 게시물이라는 것을 알고 있지만, 현재/다음/이전/이전을 더 잘 설명 할 수 있습니다. 예시:

$array = array(1,2,3,2,5);

foreach($array as $k => $v) {
    // in foreach when looping the key() and current() 
    // is already pointing to the next record
    // And now we can print current
    print 'current key: '.$k.' and value: '.$v;
    // if we have next we can print its information too (key+value)
    if(current($array)) {
         print ' - next key: '.key($array).' and value: '.current($array);
         // at the end we must move pointer to next
         next($array);
    }
    print '<br>';
}

// prints:
// current key: 0 and value: 1 - next key: 1 and value: 2
// current key: 1 and value: 2 - next key: 2 and value: 3
// current key: 2 and value: 3 - next key: 3 and value: 2
// current key: 3 and value: 2 - next key: 4 and value: 5
// current key: 4 and value: 5

나는 사용할 수 있습에 대한 반복과를 참조하여 다음 항목의 색인($array[$i+1])지만,그것은 작동하지 않을 것에 대한 연관 배열입니다.

로 변환하는 것이 좋 연관 배열로 인덱스 순차적으로 하나 array_values(), 를 사용할 수 있도록,단순 루프를 위한 솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top