listで変数代入の方法と注意点|データ行のデータ数をカウントして処理する方法はある?

このQ&Aのポイント
  • list関数を使ってデータ行のデータ数に応じた変数代入を行うことができます。
  • データ行のデータ数がわかっている場合は、list関数を使って変数に代入することができます。
  • データ行のデータ数が不明な場合は、カウント関数を使ってデータ数を取得し、list関数を使って変数に代入することができます。
回答を見る
  • ベストアンサー

listで変数代入

あらかじめ、データ行のデータ数がわかっていれば、listで変数へ代入してあげれば問題ないと思いますが、データによってはデータ行のデータ数が10個とかそれ以上になると、その分だけlist($data_○.......................)とすると面倒なので、簡単に行のデータ数をカウントしてlist関数を使った方法で処理する方法はないのでしょうか? $data_01とかアンダーバー末尾数字みたいな方法でlist($data_01,$data_02,$data_03,,,,,,,,,,,,,,,,,,,,,)として変数に代入したいで教えて下さい。 sample.csv りんご1,ばなな1,いちご1 りんご2,ばなな2,いちご2 りんご3,ばなな3,いちご3 define(csvdata, "sample.csv"); $data = file(csvdata); for ($i = 0; $i < count($data); $i++) { list($data1,$data2,$data3) = split(",", $data[$i]);

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

まず、file関数で全行を配列としてロードしていて、全行に対して処理をするっていう前提があるのであれば、 forでループさせるより、foreachでループさせたほうが楽じゃないですかね。 <?php define(CSV_DATA, 'sample.csv'); $data = file(CSV_DATA); foreach($data as $r){ //処理 } ?> foreachなら上記のように、命名($rのこと)を短くできるので、yambejpさんがおっしゃるように、list使わないでそのまま書いたほうが早い気がします。 それでも、というのであれば、可変変数を使う感じですね。 <?php for($i=0; $i<count($data); $i++){ $j=1;foreach(explode(',', $data[$i]) as $val) ${sprintf('data_%02s', ++$j)} = $val; } ?> というようにすれば、$data_01、$data_02といった変数が自動的に表示されるようになったりしますが、 まぁ、面倒くさいですね。

midorin_h
質問者

お礼

確かにForeachでループさせた方が楽ですよね!それでもということでコードまで書いて頂きましてありがとうございます。 いろいろと検証しながらやってみます。また何かあればよろしくお願いします。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>アンダーバー末尾数字みたいな方法 どうしてもというなら止めないが、汎用性も低いしやめた方が賢明 (アンダーバー+1からはじまる2桁だと結局99しかつくれないし) 普通に配列のまま処理した方がよいのでは? 変数でやるなら $xxx='yyy'; $$xxx='zzz'; print $yyy; 的な処理をいれることになりそうです

関連するQ&A

  • スプレッドシートでデータの入力規則からリスト選択す

    スプレッドシートでデータの入力規則からリスト選択すれば行の色が全て以下の色になるように設定したいのですがやり方がわかりません。 どなたかわかる方お願い致します! リストは以下の3つ ・りんご ・バナナ ・いちご りんごを選択したらその行は全て赤になる バナナを選択すればその行は全て黄色になる いちごを選択すればその行は全て青になる

  • 【EXCEL2000】2つのリストの合計を出すには?

    リストA リンゴ 3 みかん 5 バナナ 2 スイカ 3 リストB りんご 2 メロン 4 バナナ 3 いちご 2 ↑のような2つのリストがあるとして、 リストC りんご 5 みかん 5 バナナ 5 スイカ 3 メロン 4 いちご 2 リストA・Bの合計がリストCのようにするにはどのような関数を使えばいいかお解りになる方教えてください。 判りづらい質問で申し訳ありません。m(_ _)m ※品名と数量は別セルです。

  • 【C言語】テキストファイル内のデータを一行削除

    いつもお世話になっております。 ファイル操作についてご教授ください。 sample.txtに下記のデータが格納されています。 【sample.txt】 ------------------- りんご 100円 バナナ 120円 苺 150円 ------------------- この状態で、scanfで「バナナ」と入力し、 sample.txtからバナナの行を削除し、 行を詰めるようにしたいのですが、 どのようにしたらいいのでしょうか。 【流れ】 "文字を入力してください"のメッセージ。   ↓ 「バナナ」と入力。   ↓ ------------------- りんご 100円 苺 150円 ------------------- 上記のように、scanfで入力した「バナナ」の行が削除され、 行が詰められている上状態にしたいです。 超が付くほどの初心者なので、 ソースも書いていただけると幸いです。 どうぞ宜しくお願い致します。

  • 基準化したデータより得られた回帰式に新たな説明変数を代入する際の取り扱いについて

    基準化したデータより得られた回帰式に新たな説明変数の数値を代入し、従属変数の数値を計算(予測)する際、その代入される説明変数も基準化されている必要があると思いますが、その基準化の方法はどのように行えばよいのでしょうか? 例えば、サンプル数10、従属変数1、説明変数4というデータセットがあり、全変数を基準化し回帰係数を求めたとします。 得られた回帰式を用い新しいデータの説明変数の数値を代入することにより説明変数の値を予測したいと思います。 この際、この新たなデータも基準化される必要があると思うのですが、基準化する際には回帰係数を求めるために用いた10個のサンプルより計算された各説明変数の平均及び標準偏差を用いて、基準化を行うのでしょうか? 具体的には10個のサンプルから計算された説明変数a,b,c,dの平均がそれぞれ2,4,6,8、及び標準偏差が10,20,30,40であったとします。 新たなデータの説明変数a,b,c,dの値が3,6,9,12であった場合は、それぞれ(3-2)/10, (6-4)/20, (9-6)/30, (12-8)/40の値を計算し、その数値を回帰式に代入するのでしょうか? 長くなってしまい申し訳ありませんが、どなたか詳しい方がいましたら是非教えていただきたくお願いします。

  • binファイルが軽くなる変数への代入処理について

    変数に値を代入する方法はいろいろあるかと思いますが、 コンパイル後に最もバイナリファイルが軽くなる処理はどのような処理でしょうか。 例として、1000バイトのデータを変数に代入する際、 (1)直接一つずつ代入する。 data[0] = 0x00; data[1] = 0x00; ・・・ data[999] = 0x00 (2)変数の定義時に代入(初期化)を行う。 unsigned char data[1000] = {0x00,0x00,・・・・0x00} 等ありますが、どちらの処理が有効でしょうか。 また、その他有効な処理方法等がありましたら、ご教授願います。 グローバル変数として定義するか、かローカル変数として定義するか、 defineで代入値を持つ等、定義時の方法でも違いがありましたら、 教えて頂けると助かります。

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • エクセル 最大値データのある行のみを残したい。

    表題の質問をさせていただきます。よろしくお願いいたします。 A列には商品名 B列には販売数があるとします。 商品には一回しか出てこない物や何度も出てくるものがあります。 そこで、販売数が最大値のみの重複しない商品データにする方法をお聞きしたいのです。 できれば非表示的な処理ではなく不要行削除が望ましいです。 例 下の場合 りんご 3(重複商品の最大値) みかん 5(単独商品) りんご 1 バナナ 6(単独商品) りんご 2 イチゴ 2(重複商品の最大値) イチゴ 1 ↓にしたいのです。 りんご 3 みかん 5 バナナ 6 イチゴ 2 よろしくお願いいたします。

  • split後のデータ数でなくて、リスト値を代入したい。

    my %hash = (); $hash{'NAMAE'} = "田中"; $hash{'TEN'} = split(/,/, "100, 50, 70"); 名前はスカラーデータなので、問題ないのですが点数はリストなので このまま代入し、 $has{'TEN'}で見てみると3というデータ数が入ります。 これをリストで代入させたいのですがどうすればよいのでしょうか?

    • ベストアンサー
    • Perl
  • 同じ行の中で重複するデータを削除してつめる方法

       A    B    C     D      E    F 1|りんご|いちご|りんご|ぶどう|ばなな|りんご 2|すもも|ばなな| 3|りんご|りんご|びわ | 4|かき |りんご|ばなな| データが上記のように記入されている場合、 下記のように、同じ行の中で重複するデータを削除してつめる方法をご伝授ください。     A    B    C     D      E    F 1|りんご|いちご|ぶどう|ばなな|  2|すもも|ばなな| 3|りんご|びわ | 4|かき |りんご|ばなな| よろしくお願いします。

  • エクセルで2列に入力された同一データを全て抽出したい

    下の表でA列とB列に入力された「バナナ」を全て、すなわち1,2,3,5行目を抽出をしたいのです。 データ量が1000行を越すため、効率よく抽出する 方法を教えてください。     A    B 1 バナナ  みかん 2 りんご  バナナ 3 バナナ  バナナ 4 いちご  みかん 5 バナナ  いちご

専門家に質問してみよう