2

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
}
4

5 に答える 5

7

このようにシンプルで、カウンターやその他の「ハック」がありません。

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

   // あなたのもの

   if (next($array) === false) {
      // これが最後の繰り返しです
   }
}

を使用する必要があることに注意してください===。関数は、または "" (空の文字列)などnext()の非ブール値を返す可能性があるためです。false0

于 2009-10-30T19:34:12.267 に答える
5

foreachを使用して配列を反復処理する必要はありません。end()、key()、およびcurrent()php関数を使用して、最後の要素に到達し、そのキー+値を取得できます。

<?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";

?>

反復でチェックしたい場合でも、end()関数は便利です。

foreach ($a as $key => $value) {
    if ($value == end($a)) {
      // this is the last element
    }
}
于 2012-05-18T22:31:46.533 に答える
3

他の答えが間違いなく示すように、それを行う方法はかなりあります。しかし、 SPLとその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 よりも冗長ですが、それだけではありません。そして、すべての異なる SPL イテレーターは、一度習得すると、まったく新しい世界が開かれます :)ここに素晴らしいチュートリアルがあります。

于 2009-10-30T18:43:37.610 に答える
3

反復中に配列を変更していないと仮定すると、ループ内でデクリメントするカウンターを維持でき、0 に達すると最後の処理を行います。

<?php
$counter = count($kvarr);
foreach ($kvarr as $key => $value)
{
    --$counter;
    if (!$counter)
    {
        // deal with the last element
    }
}
?>
于 2009-10-30T18:43:52.293 に答える
1

配列ポインタ トラバーサル関数 (特に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)。そうしないと、値をメモします。

于 2009-10-30T18:47:12.237 に答える