dポイントプレゼントキャンペーン実施中!

hoge[0]に対して、配列の中身を処理して, 最後にカンマを付与
hoge[1]に対して、配列の中身を処理して, 最後にカンマを付与
hoge[2]に対して、配列の中身を処理して, 最後にカンマを付与
hoge[3]に対して、配列の中身を処理して, 最後にカンマを付与しない

というようなことをするとき、
どう書けばよいでしょうか?

for ($i = 0 ; $i <count($hoge); $i++) {
  if($i< count($hoge)-1){
   //配列の要素が最後じゃないのに対する処理
    .",";
 }else{
   //配列の要素が最後のに対する処理
 }
}

ってしたら、とりあえず、動いたのですが、
普通はどういう風に書くのでしょうか?

foreachとか、あるいは、配列の最後に対してする何か
書き方ってあるのでしょうか

A 回答 (6件)

何故最後にカンマを付与しないのかの理由によりますね。


連結してCSVのようにしたいのなら、

$val = array("a","b","c");
$str = implode(",",array_map( function($x){ return "<<$x>>";}, $val));

とか。

全部に付けちゃって、ループ終了後に削るというのもあり。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>$str = implode(",",array_map( function($x){ return "<<$x>>";}, $val));
array_map、これまで使ったことがなかったので、大変参考になりました。
また、自分の環境(5.2.5)では、そのままだとエラーになったのですが、
無名関数部分を分解すると動きました。
「無名関数は PHP 5.3.0 以降で使用可能です。」てことですよね…

>全部に付けちゃって、ループ終了後に削るというのもあり。
なるほど…。そういう考えもありですねー

お礼日時:2011/06/08 22:45

難しく考える必要はありません。

1番の方が既に正解を書いてますが、

> $result = implode(",", $hoge);

の1行が正解です。$hogeに値が入っているのならこの1行だけで事足ります。


なお、

>foreach($hoge as $key => $val){
>$hoge[$key] = $val; // $val を処理して配列に戻す処理
>}

はforeach前と後とで同じ値なので不要です。
ループを削除するからunsetも不要です。
    • good
    • 0
この回答へのお礼

みなさん、回答ありがとうございました。

大変、参考になりましたー

お礼日時:2011/06/08 22:47

カンマをつけるだけなら既出のとおりimplodeだとして


処理が必要なときはこんな感じで処理していますね

<?PHP
$hoge=range(1,4);

foreach($hoge as $val){
if($str!="") $str.=",";
$str.="'{$val}'";
}

print $str."<br>";

?>
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2011/06/08 21:47

「配列の中身を処理」の部分が、最後とそれ以外が同じなのでしたら、順番をちょっと変えて



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 を使うって感じ。

前者の先頭かどうか判断する方式は、文字出力以外の処理にも適用できるのがメリットです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

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

お礼日時:2011/06/08 20:46

質問内容のように配列の最後には何も施さないという前提ですが、


配列の個数を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)."'";
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>質問内容のように配列の最後には何も施さないという前提ですが、
配列の個数を1引いてループさせれば良いような気がします。
そうですね…。言われてみるまで、全く気が付きませんでしたー


>//単純に変数に配列の中身を'中身',として最後にカンマを渡さない
>$str = "'".implode("','",$hoge)."'";
区切り文字を変えると、こういう書き方もできるんですね。勉強になりました

お礼日時:2011/06/08 19:53

「配列の中身を処理して」が同じ動作だとしてですが。



foreach($hoge as $key => $val){
$hoge[$key] = $val; // $val を処理して配列に戻す処理
}
unset($key, $val);
$result = implode(",", $hoge); // 配列をカンマ( , )で連結した文字列にする。

こんな感じで処理しますが、いかがでしょうか?
私も、他の方の処理方法を見てみたいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

>implode
便利ですねー

お礼日時:2011/06/08 19:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!