PHPを書いているとよく遭遇するケースなのだが、配列をカンマ区切りの文字列に変更したいことがある。

この時、implode関数を使えば最も簡単にカンマ区切りの文字列を作ることができる。

$arr = array('a', 'b', 'c');
$arrSeparated = implode(',', $arr);

echo $arrSeparated;
// a,b,c

しかし配列の値によって実行する処理を変えたい場合がある。

例えば、SQLのUPDATE文で使用するパラメーターを配列から生成する場合、値が文字列であればシングルクォーテーションで囲むなどといった処理が必要である。

implode関数ではこのような柔軟な処理分けができないので、foreach文を使うことになる。

foreach文でカンマ区切りの文字列を作る場合、以下のようなコードになる。

$arr = array('a', 'b', 'c', 1, null, 3);
$arrSeparated = "";

foreach($arr as $val) {
  if(is_string($val)) {
    $arrSeparated .= "'".$val."'";  
  } elseif(is_null($val)) {
    $arrSeparated .= "NULL";
  } else {
    $arrSeparated .= $val;
  }

  $arrSeparated .= ",";
}

echo $arrSeparated;
// 'a','b','c',1,NULL,3,

しかしこれでは末尾にまでカンマが入ってしまうので、ループの最後だけカンマを付けないようにしたい。

このような時はnext関数を使うと良い。
先ほどのコードを一部改変してみた。

$arr = array('a', 'b', 'c', 1, null, 3);
$tmp = $arr;
$arrSeparated = "";

foreach($arr as $val) {
  if(is_string($val)) {
    $arrSeparated .= "'".$val."'";  
  } elseif(is_null($val)) {
    $arrSeparated .= "NULL";
  } else {
    $arrSeparated .= $val;
  }

  if(next($tmp) !== false) {
    $arrSeparated .= ",";
  }
}
echo $arrSeparated;
// 'a','b','c',1,NULL,3

next関数は配列の内部ポインタを一つ進めた結果を返す関数で、一つ進めた先に値がなければfalseを返す。

これを応用し、まず配列を$tmpに格納しておいて、14行目のif文でfalseでない場合のみカンマをつけるようにしている。

これで理想どおりの動きとなった。