• 締切済み

CSV形式の並び替え

いつも助言頂き感謝します。 CSVファイルに下記のように 名前,性別,年齢 を記述したファイルがあります。 これを配列にいれ、listとsplit でTABLEを表示させることは出来るのですが、取り込んだ配列を年齢の若い順に表示させるにはどのようにすれば良いでしょうか? $log_name = "/home/www/luzy.castsystem.jp/log/4.txt"; $array = file($logfile); $c = count($array); $i = 0; while($i < $c){ list($name,$sex,$age) = split("\,",$array[$i]); $i++; } 太郎,男,15 一郎,男,10 次郎,男,18 花子,女,17

  • mr59
  • お礼率33% (70/210)
  • PHP
  • 回答数2
  • ありがとう数1

みんなの回答

  • i2719
  • ベストアンサー率35% (11/31)
回答No.2

$array = file($logfile); foreach($array as $person){ list($name,$sex,$index[]) = split('\,',$person); } array_multisort($index,SORT_NUMERIC ,$array); echo '<table>'; foreach($array as $person){ list($name,$sex,$age) = split('\,',$person); echo "<tr><td>$name</td><td>$sex</td><td>$age</td></tr>"; } echo '</table>';

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

まずは $name,$sex,$age も配列としていったん値を格納し、array_multisort()で$ageをキーにソートすればいいかと思います。 while($i < $c){ list($name,$sex,$age) = split("\,",$array[$i]); $i++; } の部分を、 while($i < $c){ list($name[$i],$sex[$i],$age[$i]) = split("\,",$array[$i]); $i++; } array_multisort($age,SORT_NUMERIC ,$name,$sex); として、この後で、改めてループを回してTABLEタグを組み立ててみてください。 array_multisort()の解説は以下を参照してください。 http://jp2.php.net/manual/ja/function.array-multisort.php

関連するQ&A

  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • CSVデータの編集の際の重複チェックの方法

    今、data.csv(カンマ区切り)として、左から順位、名前、性別という3項目で、10人程度のリストデータがあります。 data.csv(カンマ区切り)を編集するようにしていますが、順位は重複してはならないので、重複していたらエラーを出したいのですが。。。 ($rank,$name,$sex) = split(/\,/,$line); です。 open(IN,"$logfile") || &error("ファイルが開けません"); @lines = <IN>; close(IN); # 情報の書換え foreach $line (@lines) { ($rank,$name,$sex) = split(/\,/,$line); $line = "$in{'rank'},$name,$sex\n";} push(@new,$line); } # ファイルを更新 open(OUT,">$logfile") || &error("ファイルが開けません"); print OUT @new; close(OUT);

  • 区切り文字を配列に格納する方法を教えて下さい。

    区切り文字を配列に格納する方法を教えて下さい。 $array[] = "abc,1981,1,12"; $array[] = "def,1982,2,18"; $array[] = "ghi,1991,4,12"; list($name[$i],$yy[$i],$mm[$i],$dd[$i]) = split("\,",$array[$i]); でループさせればそれぞれの変数に代入できますが、例えば $name["abc"]["yy"] = "1981"; $name["abc"]["mm"] = "1"; $name["abc"]["dd"] = "12"; のように分解するにはどうすれば良いでしょうか?

    • 締切済み
    • PHP
  • アンケートの回答のすべての項目をcsv保存するには?

    下記の内容ではemailしか保存されません。送信フォームには他にnameとcommentがあります。すべてを保存するにはどこに何を追加すればよいでしょうか。 ↓以下csv書き込みの記述抜粋 ----- $logfile = 'logfile'.'.csv';#(ファイル名変更推奨) $log_permissions = 0666; # ファイルが存在しなければ、作成後アクセス権設定してヘッダー書き込み if (-e $logfile) { }else{ open(LOG,">$logfile") || &error("logfile create error!"); chmod $log_permissions, $logfile if $log_permissions; if ($log_header) { print LOG $log_header };#ヘッダー不要ならこの行は削除 } # 出力 open(LOG, ">>$logfile") || &error("logfile open error!"); foreach $i (1..(@key)) { print LOG "$val[$i]".','; } print LOG "\n"; close(LOG); -----

    • ベストアンサー
    • CGI
  • snotty

    はじめまして。 PHPの配列で悩んでいます。詳細は下記の通りです。 array { [0]=> array { ["name"]=>"田中一郎" ["price"]=>4000 } [1]=> array { ["name"]=>"高橋太郎" ["price"]=>5000 } [2]=> array { ["name"]=>"田中一郎" ["price"]=>5000 } } 上記のような配列があった場合、["name"]でグループ化し、 ["price"]の合計を出したいのです。 下記のような配列にしたいのです。 array { [0]=> array { ["name"]=>"田中一郎" ["price"]=>9000 } [1]=> array { ["name"]=>"高橋太郎" ["price"]=>5000 } } 上記のように、「田中一郎」をグループ化し、グループ化した合計の配列化したいのですが、何かよい方法等ありますでしょうか? 申し訳ありませんが、ご教授よろしくお願いします

    • ベストアンサー
    • PHP
  • VBScriptでCSVファイルを読み出したい

    現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。 CSVファイルの中身は、サンプルで shop,price,sales 001,500,700 003,1200,90 024,,18 という並びになっています。 実データは300件くらいです。 1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。 1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを 2次元配列arrshopに順次保存?したいのです。 ---------------------------------------------- dim strLine '1行ずつ読込んだデータを持つ dim ntLineNum '行数のカウント dim arrLine '","で区切った要素を持つ一次元配列 dim arrshop '一次元配列になった要素を2次元配列として格納 Do until .AtEndOfStream   strLine = .ReadLine   if 0<>strComp("",Trim(strLine)) then ntLineNum = intLineNum + 1   end if   arrLine = split(strLine , ",")   arrshop = Array(arrLines,i) i = i + 1 loop ----------------------------------------- msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。 Array関数が上手くないような気もします・・・。 どなたかご教授お願いします(>_<。)

  • csvファイルの不定長フィールドの値を取得する方法

    いつもお世話になります。 tst.csv aaa,bbbb,ccc dd,eeeeeee,ffff,gg,hh iii,jj ・・・・・ などのように レコードごとにフィールド数の異なるcsvファイルの 各レコードの値を取得したいのですが、できなくて試行錯誤しています。 フィールドの数が同じならば 例えば、フィールド数が2ならば $array = file("tst.csv"); $c = count($array); $i=0; while($i < $c){ $RowData=$array[$i]; list($fiel1,$fiel2) = split("\,",$RowData); print('$fiel1='.$fiel1.' $fiel2'.$fiel2."<br>"); $i++; } とすればできます。 ところが、フィールド数がいくつあるかわからないので、 list($fiel1,$fiel2) = split("\,",$RowData); を list($fiel) = split("\,",$RowData); としてforeachで値を取り出そうとしましたが、 foreach ($fiel as $Value) { echo $value.'<br>'; } Invalid argument supplied for foreach() というエラーが表示され できません。 何が、Invalid argumentなのか見当がつきません。 各レコードの値を $fiel[1] $fiel[2] $fiel[3] などに格納することはできないものでしょうか。 おわかりになる方なにとぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列操作について

    お世話になります。 $obj = array(1 array(id=>111 name=>aaa date=yyyymmdd array(2 array(id=>222 name=>bbb date=yyyymmdd 上記のようなオブジェクト($obj)があるとして この最下層の連想配列データ(id,name,date)を 配列にしたい時は、以下のような書き方で取れると 思いますが、もっとすっきりさせる書き方などありますか? $a = array(); $c = count($obj); for($i=0; $i<$c; $i++){ $a = $obj[$i]['id']; $a = $obj[$i]['name']; $a = $obj[$i]['date']; $i++}

    • ベストアンサー
    • PHP
  • VBSにてCSV読み込みし比較

    ある場所に比較するCSVファイルを2個格納しております。 ただしCSVファイル名は可変であります。 その場合 Set objTextA = objFSO.OpenTextFile("C:\" & "A.csv")と特定して呼び出せません。 名前が可変なときのため、そのパスにあるCSV2個を順に呼び出すにはどうすればよいのでしょうか。 また呼出し後、split関数により、配列に入れます。A配列とB配列に格納したとします。 一つ一つ比較していきたいのですが、 以下のような構文の場合、比較で違ったときテキストに書き込みとなりますでしょうか? for i=0 to i=10 step 1 if strcomp(a(i) ,b(i))) = 1 then テキストに書き込み endif next

専門家に質問してみよう