نظرة خاطفة إلى الأمام عندما بالتكرار مجموعة في PHP
سؤال
هل من الممكن أن "نظرة خاطفة إلى الأمام" في حين بالتكرار مجموعة في 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(), ، مما يتيح لك استخدام بسيط للحلقة الحل.