سؤال

وأنا حلقات من خلال مجموعة النقابي مع foreach. أود أن تكون قادرة على معرفة ما اذا كان الزوج قيمة رئيسيا يجري التعامل معها هو ما أستطيع أن أعطي ذلك معاملة خاصة الماضية. أي أفكار كيف أستطيع أن أفعل ذلك أفضل وسيلة؟

foreach ($kvarr as $key => $value){
   // I'd like to be able to check here if this key value pair is the last
   // so I can give it special treatment
}
هل كانت مفيدة؟

المحلول

وعلى افتراض انك لا تغيير مجموعة في حين بالتكرار من خلال ذلك، هل يمكن الحفاظ على عداد التناقصات في حلقة وبمجرد وصولها 0، كنت التعامل مع الاخير:

<?php
$counter = count($kvarr);
foreach ($kvarr as $key => $value)
{
    --$counter;
    if (!$counter)
    {
        // deal with the last element
    }
}
?>

نصائح أخرى

وبسيط كهذا، خالية من العدادات وغيرها "الخارقة".

foreach ($array as $key => $value) {

   // your stuff

   if (next($array) === false) {
      // this is the last iteration
   }
}

تجدر الإشارة إلى أن لديك لاستخدام ===، لأن next() قد ترجع الدالة قيمة غير المنطقية التي على تقييمها إلى false ، أو مثل 0 أو "" (سلسلة فارغة).

ونحن لسنا بحاجة إلى تكرار خلال مجموعة مع foreach، يمكننا استخدام النهاية ()، مفتاح () ووظائف الحالية () فب للوصول إلى العنصر الأخير والحصول على انها قيمة + الرئيسية.

<?php

$a = Array(
  "fruit" => "apple",
  "car" => "camaro",
  "computer" => "commodore"
);

// --- go to the last element of the array & get the key + value --- 
end($a); 
$key = key($a);
$value = current($a);

echo "Last item: ".$key." => ".$value."\n";

?>

إذا كنت تريد التحقق من ذلك في التكرار، وظيفة نهاية () لا يزال يمكن أن تكون مفيدة:

foreach ($a as $key => $value) {
    if ($value == end($a)) {
      // this is the last element
    }
}

وهناك عدد غير قليل من الطرق للقيام بذلك كما إجابات أخرى سوف لا تظهر شك. ولكن أود أن أقترح أن تتعلم SPL و لها <لأ href = "HTTP: //www.php. صافي / cachingiterator "يختلط =" نوفولو noreferrer "> cachingIterator . هنا مثال:

<?php

$array = array('first', 'second', 'third');

$object = new CachingIterator(new ArrayIterator($array));
foreach($object as $value) {
    print $value;

    if (!$object->hasNext()) {
        print "<-- that was the last one";
    }
}

ومن أكثر مطول من foreach بسيط، ولكن ليس كل ذلك بكثير. وجميع المكررات الاسكتلندي مختلفة تفتح عالما جديدا بالنسبة لك، بمجرد أن تتعلم منهم :) <لأ href = "http://www.phpro.org/tutorials/Introduction-to-SPL.html" يختلط = "نوفولو noreferrer "> وهنا لطيفة تعليمي.

هل يمكن استخدام وظائف اجتياز مجموعة مؤشر (على وجه التحديد next ) لتحديد ما إذا كان هناك عنصر آخر بعد الراهنة واحد:

$value = reset($kvarr);
do
{
  $key = key($kvarr);
  // Do stuff

  if (($value = next($kvarr)) === FALSE)
  {
    // There is no next element, so this is the last one.
  }
}
while ($value !== FALSE)

لاحظ أن هذه الطريقة لن تجدي نفعا إذا الصفيف الخاص بك يحتوي على العناصر التي تقدر قيمتها FALSE، وستحتاج للتعامل مع العنصر الأخير بعد القيام جسمك حلقة المعتاد (لأن تقدم مؤشر مجموعة بالدعوة next) أو آخر memoize القيمة.

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