نظرة خاطفة إلى الأمام عندما بالتكرار مجموعة في PHP

StackOverflow https://stackoverflow.com/questions/2458099

  •  20-09-2019
  •  | 
  •  

سؤال

هل من الممكن أن "نظرة خاطفة إلى الأمام" في حين بالتكرار مجموعة في PHP 5.2?على سبيل المثال, أنا غالبا ما تستخدم foreach التعامل مع البيانات من مجموعة:

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

لكني غالبا ما تحتاج إلى إلقاء نظرة خاطفة على العنصر التالي في حين يذهب من خلال مجموعة.وأنا أعلم أنني يمكن استخدام for حلقة الرجوع إلى البند التالي من قبل انها مؤشر ($array[$i+1]) ، ولكن لن تعمل صفائف النقابي.هل هناك أي أنيقة حل مشكلتي ربما تنطوي على SPL?

هل كانت مفيدة؟

المحلول

ويمكنك استخدام CachingIterator لهذا الغرض.

وهنا مثال:

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

ووCachingIterator دائما خطوة واحدة وراء مكرر الداخلية:

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

وهكذا، عند القيام foreach على $collection، العنصر الحالي للArrayIterator الداخلية ستكون العنصر التالي بالفعل، مما يتيح لك نظرة خاطفة إلى ما يلي:

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 دائما في محاولة لتحويل العنصر الحالي إلى سلسلة. إذا كنت ترغب في تكرار عبر مجموعة وجوه وضرورة الوصول إلى خصائص وأساليب، وتمرير CachingIterator::TOSTRING_USE_CURRENT باسم المعلمة الثاني إلى منشئ.


وعلى sidenote، وCachingIterator يحصل عليها اسم من القدرة على تخزين كل النتائج وكرر ذلك مرارا حتى الآن. لهذا العمل، لديك لإنشاء مثيل مع 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 و <لأ href = "http://php.net/prev" يختلط = "noreferrer"> prev لتكرار صفيف. current إرجاع قيمة المواد الحالية و<لأ href = "http://php.net" يختلط = "noreferrer" > 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

وأنا أعلم أنني يمكن استخدام حلقة for و الرجوع إلى البند التالي من قبل مؤشر ($array[$i+1]) ، ولكن لن تعمل صفائف النقابي.

النظر في تحويل الخاص بك النقابي في بالتتابع فهرسة واحد مع array_values(), ، مما يتيح لك استخدام بسيط للحلقة الحل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top