旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

PHPでforeach最終ループを簡潔に知りたい

2007年5月30日

現状の有力案

foreach ($hash as $k => $v) {
    if (end(array_keys($hash)) === $k) {
        echo "last";
    }
}

これだと、$hashの内部配列ポインタとやらも汚染しないでいい感じ。
若干重そうな気がしますけど・・・気にしない!

ボツ案

foreach ($hash as $k => $v) {
    if (next($hash) === false) {
        echo "last";
    }
}

これだと

  • $hashの要素値にfalseが含まれている場合にバグる
  • 1回のforeachループで必ず1回のnextを通す必要がある。

という点でダメ。

今までのやり方

$count = 1;
$max = count($hash);
foreach ($hash as $k => $v) {
    if ($max === $count++) {
        echo "last";
    }
}

基本的な線として、これよりはいいよなと思いました。

後、初めて知ったこと

foreach ($hash as $k => $v) {
    $hash = null;
}

これは途中でループが止まらない。
マニュアルによると、参照渡しでない限りは、
foreachをループさせるためにそれ専用に値をコピーするとのこと。

えー・・・。

2012/11/20 追記

上記の方法は、全くオススメしません
デメリットとしては以下が上げられます

  • 一般的なロジックでないので読み手が混乱する
  • その配列が性能に影響がない位短いのかを読み手が理解する必要が出てしまう

つまりは、他の人に迷惑が掛かる書き方です
一方、対価としてのメリットは、ローカル変数と行数が少し減るだけなので
見合ってないと思います

現在のPHPは詳しくないので知りませんが
無理なら「無理な言語だ」と諦めた方が幸せになると思われます

まだ、多少アクセスがあるようなので責任を感じて追記しました