PHP :: foreach ループ内で、next() と current()

foreach ブロック内で、配列ポインタが終端(最後の要素)に達したかどうかを判定する Tips です。

<?php
    $arr = array(
        '001' => 'りんご', 
        '002' => 'みかん', 
        '003' => 'メロン', 
        '004' => 'バナナ'
    );
?>

上記のような配列を、以下のように <a href=””>…</a> でリンクにしたい。区切り文字には | を使いたい。

<a href="./001.html">りんご</a> | 
<a href="./002.html">みかん</a> | 
<a href="./003.html">メロン</a> | 
<a href="./004.html">バナナ</a>

りんご | みかん | メロン | バナナ


こんなときは、foreach を利用するに限りますが、単純にループを回しただけでは、
最後にも | が入ってしまいます。。

<?php foreach($arr as $key => $val): ?>
<a href="./<?php echo $key ?>.html"><?php echo $val ?></a> | 
<?php endforeach; ?>

 ↓結果

りんご | みかん | メロン | バナナ |



この問題を next() と current() を使って解決します。
以下はソースコードと解説です。

ソースコード

<html>
 
<?php
    $arr = array(
        '001' => 'りんご', 
        '002' => 'みかん', 
        '003' => 'メロン', 
        '004' => 'バナナ'
    );
?>
<?php foreach($arr as $key => $val): next($arr); ?>
<a href="./<?php echo $key ?>.html"><?php echo $val ?></a>
<?php echo (current($arr) !== false) ? ' | ' : '' ?>
<?php endforeach; ?>
 
</html>

 ↓結果

りんご | みかん | メロン | バナナ


解説

  1. foreach ループの最初で、next() にて 配列 $arr の内部ポインタをひとつ進めておきます。
    • next() はループ処理中において毎回実行されます。
      • ここで next() しても foreach に与えられた $arr に影響はありません。
      • PHPのバージョンによっては影響されるようです。その場合、下記の ソースコード(2) のように記述します。(2010/09/03追記)
  1. current() にて現在のポインタが有効かどうか(配列の範囲外に達したかどうか)を判定します。
    1. 有効(範囲内)であれば、| を出力。
    2. 無効(範囲外)であれば 空文字 を出力。



ソ-スコード(2)

一時変数 $tmp に $arr を代入し、ポインタ判定用として利用します。

<?php $tmp = $arr; foreach($arr as $key => $val): next($tmp); ?>
<a href="./<?php echo $key ?>.html"><?php echo $val ?></a>
<?php echo (current($tmp) !== false) ? ' | ' : '' ?>
<?php endforeach; ?>



ソ-スコード(3)

current関数を使用しない例

<?php $tmp = $arr; foreach($arr as $key => $val): ?>
<a href="./<?php echo $key ?>.html"><?php echo $val ?></a>
<?php echo (next($tmp) !== false) ? ' | ' : '' ?>
<?php endforeach; ?>



余談

値だけを出力するのであれば、

implode(' | ', $arr);

でこと足ります…