それなりブログ

とあるWebエンジニアのそれなりのブログ、JavaScript/Node.js/Python/PHP/ゲーム作成 など

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

現状の有力案

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は詳しくないので知りませんが
無理なら「無理な言語だ」と諦めた方が幸せになると思われます

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


2 Responses to “PHPでforeach最終ループを簡潔に知りたい”

  • 匿名 より:

    ループ毎にいちいち array_keys と end を計算させるのは微妙ですね。
    ループの前に予め end(array_keys($hash)) を計算しておいて、ループ内では単純にそれと比較させるだけのほうが軽そうです。

  • kjirou より:

    その通りだと思いました。
    ・・・ちなみに、今の自分ですと $max と $count を比較する方法で書きそうです。
    大体どの言語でも使える方法なので・・・。


コメントを残す

メールアドレスが公開されることはありません。

Categories

Archives