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

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

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

hoge[0]に対して、配列の中身を処理して, 最後にカンマを付与 hoge[1]に対して、配列の中身を処理して, 最後にカンマを付与 hoge[2]に対して、配列の中身を処理して, 最後にカンマを付与 hoge[3]に対して、配列の中身を処理して, 最後にカンマを付与しない というようなことをするとき、 どう書けばよいでしょうか? for ($i = 0 ; $i <count($hoge); $i++) {   if($i< count($hoge)-1){    //配列の要素が最後じゃないのに対する処理     .",";  }else{    //配列の要素が最後のに対する処理  } } ってしたら、とりあえず、動いたのですが、 普通はどういう風に書くのでしょうか? foreachとか、あるいは、配列の最後に対してする何か 書き方ってあるのでしょうか

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数6
  • ありがとう数6

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4851/10265)
回答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

  • 配列の要素数について

    私はよくperlで for ($i=0; $i<=$#hoge; $i++) {} などと書いたりするのですが、phpで同じようにしたいのですが、 その際、perlの配列最後の添字を返す$#hogeにあたるものはないものなのでしょうか? あくまでforeachなど別の方法論や複数行ロジックを書いて取得するなどではなく配列の最後の添字を簡単に取得できるかが問題なのです。

    • ベストアンサー
    • PHP
  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • foreachのなかで次のキーを参照するには

    こんばんわ, 現在PHPを学習しています。 たとえば, $hoge[0]=1; $hoge[1]=2; $hoge[2]=3; $hoge[3]=4; $hoge[4]=5; $hoge[5]=6; $hoge[6]=7; と配列があり,これをforeachで回していく際に,hogeが5になったときには,次の配列の要素である6を参照したい場合に foreach($hoge as $val){ if($val == 5){ /* $valの次の要素を見たい */ } else{ echo $val; } } をどのようにすれば,よろしいでしょうか。foreach文ではだめなのでしょうか。 nextやeachをしようしようとおもったのですが,うまくいきません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 動的配列が存在(要素が有る)か否かを判定できますか?

    VBAで、「For ループが初期化されていません」エラーが発生します。 動的配列が要素0の時に発生するようです。 動的配列の要素が生成された場合だけ、Forループしたいのですが、 どうやって判定すればよいのでしょうか? ------------------------------- Dim 配列() As Integer Dim i As Integer i = 0 If (i < 0) Then ' 本当は真になったり偽になったり ReDim 配列(0 To i) 配列(i) = a + b i = i + 1 End If '' if ★★★ then '' 配列が有るか確認 For Each c In 配列 MsgBox c Next '' end if -------------------------------

  • 配列のループ展開

    下記で配列内を検索しても、「存在しません」になります。 どこが、間違っているのでしょうか? <?php for($i = 1; $i <= 42; $i++) { $seminar = "http://www.hoge.com/hoge/".sprintf("%04d", $i).".html"; echo $seminar; } $url = array( $seminar ); $myUrl = "http://www.hoge.com/hoge/0020.html"; if(in_array($myUrl, $url)){ echo "配列に".$myUrl."は存在します。"; } else { echo "配列に".$myUrl."は存在しません。"; } ?>

    • ベストアンサー
    • PHP
  • PHPで多次元配列を一度に処理するには

    例えば、 array(  [hoge1-1] => hoge1-1_value  [hoge1-2] => array(   [hoge2-1] => hoge2-1_value   [hoge2-2] => hoge2-2_value   [hoge2-3] => array(    [hoge3-1] => hoge3-1_value   )  ) ) のような多次元配列で、すべてのvalueに同じ処理を施すには foreachのなかにforeachを書いて処理するしかないのでしょうか。 もっと単純に、すべてのファイルを一度に処理できるようにする方法は ないでしょうか?

    • ベストアンサー
    • PHP
  • 配列要素の並べ替え

    $Res[$i]という配列に、数字の要素が入っているんですが、それを昇順で並べ替えして要素の間に/を入れたいのですが、 foreach (sort {$a cmp $b} keys %Res) { $Res2 = $Res[$i] + "/" } どうもこの記述では上手くいかないので、どなたか教えて下さい!!

    • ベストアンサー
    • Perl
  • 配列の要素を結合する方法

    すごく基本的なことで恥ずかしいのですが、 条件を満たす配列の要素を結合し、元の配列に返す方法がわかりません。 foreach $aa (@aa) { if ($aa =~ /-/){ } } とまでは考えたのですが・・・ どなたかお分かりの方、よろしくおねがいします。

    • ベストアンサー
    • Perl
  • 複数の配列の要素を繰り返し処理をして書き込むと変数の中身がおかしくなってしまいます。

    いつもお世話になります 複数の配列の要素を繰り返し処理をして書き込むと変数の中身がおかしくなってしまいます。 ポストメソッドで複数のテキストを受けて書き込みたいのですが、書き込む内容が""になってしまいます print qq|<form action=\"$myself\" method=\"POST\">\n|; LOOP: foreach $i (0..7) { foreach $j ($x..$x + 3) { print qq|@eqipument[$j]<input type=text name="arg_$j" size_1=35>\n|; last LOOP if ($j == $#eqipument); } $x = $x + $x_colm; print qq|<br>\n|; } @eqipumentの配列の要素を変数arg_$jで配列が終わるまで繰り返して入力画面を表示させます その後 # デスク書き込み open(OUT,">>$logfile") || &error("Write Error : $logfile"); $j = 0; foreach(0..@eqipument) { print OUT "$in{'arg_$j'}<>"; $j++; } close(OUT); として書き込みをすると、変数arg_$jの内容が空になってしまい<>だけがかきこまれます 変数部分を arg_0,arg_1,arg_2.... と明示して書くときちんと入力画面で入力した テキストが書きこめれますが、入力項目も多いですしプログラム的にも見難いので 繰り返し処理で書き込みをしたいのですがなぜこのような結果になるのか(arg_$jの内容が空になる)理解できません又 print qq|$in{'arg_$j'}\n|;として 変数の中身を検証するためにコンソールに出力すると中身は "" になっています 宜しく御教授お願いします。

    • ベストアンサー
    • Perl
  • 配列の要素でmysqlに問い合わせ

    フォームから送信されたデータを配列として取得し、その配列の1つの要素に対してそれぞれmysqlにselectで問い合わせてageというカラムの値を取得したいと思っています。 配列の要素の数がその都度変わるので、要素が5つある場合には5回selectでデータベースに問い合わせてデータを5つ取得したいのですが、それは可能でしょうか? ためしに下記のようにしてみたのですが、うまく取得できませんでした。 $hairetu = $_POST; for($i=0; $i< count($hairetu) ; $i++){ $sql = "SELECT * FROM member where age = '$hairetu[i]';"; $res = mysql_query($sql, $conn) or die("エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); $age = $row["age"]; echo $age; } $ageの値をcount($hairetu)の回数分表示したいのですが、どのように処理していいのか分かりません。 また、根本的におかしな点もあると思いますがよろしくお願いします。

    • ベストアンサー
    • MySQL