• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列を回すとき、最後の要素だけ違う処理をしたい)

配列を回すとき、最後の要素だけ違う処理をしたい

このQ&Aのポイント
  • 配列の要素を順番に処理し、最後の要素だけ特別な処理をする際の方法について説明します。
  • 普通は、foreachループを使用して配列を回す方法が一般的です。また、条件式や組み込み関数を使用して、配列の最後の要素に対して特別な処理をすることもできます。
  • 上記の例では、forループと条件分岐を使用して、配列の最後の要素に対して別の処理を行っています。この方法でも問題なく動作するので、利用しても構いません。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4902/10363)
回答No.5

何故最後にカンマを付与しないのかの理由によりますね。 連結してCSVのようにしたいのなら、 $val = array("a","b","c"); $str = implode(",",array_map( function($x){ return "<<$x>>";}, $val)); とか。 全部に付けちゃって、ループ終了後に削るというのもあり。

re999
質問者

お礼

回答ありがとうございました。 >$str = implode(",",array_map( function($x){ return "<<$x>>";}, $val)); array_map、これまで使ったことがなかったので、大変参考になりました。 また、自分の環境(5.2.5)では、そのままだとエラーになったのですが、 無名関数部分を分解すると動きました。 「無名関数は PHP 5.3.0 以降で使用可能です。」てことですよね… >全部に付けちゃって、ループ終了後に削るというのもあり。 なるほど…。そういう考えもありですねー

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • foreach
  • ベストアンサー率51% (43/84)
回答No.6

難しく考える必要はありません。1番の方が既に正解を書いてますが、 > $result = implode(",", $hoge); の1行が正解です。$hogeに値が入っているのならこの1行だけで事足ります。 なお、 >foreach($hoge as $key => $val){ >$hoge[$key] = $val; // $val を処理して配列に戻す処理 >} はforeach前と後とで同じ値なので不要です。 ループを削除するからunsetも不要です。

re999
質問者

お礼

みなさん、回答ありがとうございました。 大変、参考になりましたー

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

カンマをつけるだけなら既出のとおりimplodeだとして 処理が必要なときはこんな感じで処理していますね <?PHP $hoge=range(1,4); foreach($hoge as $val){ if($str!="") $str.=","; $str.="'{$val}'"; } print $str."<br>"; ?>

re999
質問者

お礼

回答ありがとうございました。 >foreach($hoge as $val){ >if($str!="") $str.=","; 3の方もそうですが、foreachの中で、こういったif文判定の書き方ってできるんですねー。

すると、全ての回答が全文表示されます。
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

「配列の中身を処理」の部分が、最後とそれ以外が同じなのでしたら、順番をちょっと変えて hoge[0]に対して、配列の中身を処理 hoge[1]に対して、最初にカンマを出力して、配列の中身を処理 hoge[2]に対して、最初にカンマを出力して、配列の中身を処理 hoge[3]に対して、最初にカンマを出力して、配列の中身を処理 といった流れにする、という手があります。 最初だけカンマを出力しない、という条件判断ですので、 $outputcomma = 0; foreach($hoge as $value) { if ($outputcomma) { echo ","; } else { $outputcomma=1; } //ここで配列の要素に対する処理 } といった形で、foreach を使うことができます。 あるいは、implode を使って $result = array(); foreach($hoge as $value) { $result[] = ほげほげ;//ここで配列の要素に対する処理 } echo implode(",",$result); のようにするとか。 私はこの二つの方法を適宜使い分けてます。 implode を使う方法は、「全てを連結した文字列を作る」場合にしか使えませんし、データ量が多いとメモリ消費が多くなります。それが気にならない時には implode を使うって感じ。 前者の先頭かどうか判断する方式は、文字出力以外の処理にも適用できるのがメリットです。

re999
質問者

お礼

回答ありがとうございました。 >順番をちょっと変えて >前者の先頭かどうか判断する方式は、文字出力以外の処理にも適用できるのがメリットです。 >foreach($hoge as $value) { >if ($outputcomma) 発想もそうですが、こういった書き方もあるんだと、驚きましたー

すると、全ての回答が全文表示されます。
  • mikemike7
  • ベストアンサー率87% (97/111)
回答No.2

質問内容のように配列の最後には何も施さないという前提ですが、 配列の個数を1引いてループさせれば良いような気がします。 for ($i = 0; $i < count($hoge) - 1; $i++) { //配列の要素が最後じゃないのに対する処理 } 配列の最後だけ他の処理をしたいなら、 同じように配列の個数から1を引いてループさせ、 ループが終了してから最後の処理をすれば良いような気がします。 $lastkey = count($hoge) - 1; for ($i = 0; $i < $lastkey; $i++) { $hoge[$i] = "no".$i; // 書き換え } $hoge[$lastkey] = "last"; // 最後の配列の中身を書き換え //単純に変数に配列の中身のカンマ区切りにしたいなら $str = implode(",",$hoge); //単純に変数に配列の中身を'中身',として最後にカンマを渡さない $str = "'".implode("','",$hoge)."'";

re999
質問者

お礼

回答ありがとうございました。 >質問内容のように配列の最後には何も施さないという前提ですが、 配列の個数を1引いてループさせれば良いような気がします。 そうですね…。言われてみるまで、全く気が付きませんでしたー >//単純に変数に配列の中身を'中身',として最後にカンマを渡さない >$str = "'".implode("','",$hoge)."'"; 区切り文字を変えると、こういう書き方もできるんですね。勉強になりました

すると、全ての回答が全文表示されます。
回答No.1

「配列の中身を処理して」が同じ動作だとしてですが。 foreach($hoge as $key => $val){ $hoge[$key] = $val; // $val を処理して配列に戻す処理 } unset($key, $val); $result = implode(",", $hoge); // 配列をカンマ( , )で連結した文字列にする。 こんな感じで処理しますが、いかがでしょうか? 私も、他の方の処理方法を見てみたいです。

re999
質問者

お礼

回答ありがとうございました。 >implode 便利ですねー

すると、全ての回答が全文表示されます。

関連するQ&A