質問

私は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 や&quot;&quot;など) (空の文字列)。

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

他の答えが間違いなく示すように、それを行う方法はかなりあります。しかし、 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イテレーターは、一度学習すればまったく新しい世界を開きます:) こちらがいいチュートリアルです。

配列ポインタートラバーサル関数(具体的には 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 を呼び出して高度化するか、値をメモします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top