- ベストアンサー
2次元配列CSVのソート
2次元配列で次のCSVファイルがあります。 フォームから入力したのですが、txtファイルには項目名(列名)が保存されていません。 taro,10,119 jiro,10,90 hanako,9,120 momoko,11,98 saburo,12,111 natuyo,10,130 sirou,8,88 このデータを年齢順、及び身長順に並べ替えをしたいのです。 列の名前がないので、手動でtxtファイル1行目に simei,toshi,shinchou と追記して 01: <?php 02: $data = "c:\××\××\shinchou.txt"; 03: $array = file($data); 04: foreach($array as $key => $row){ 05: $toshi[$key] = $row["toshi"]; 06: $shinchou[$key] = $row["shinchou "]; 07: } 08: print_r($array); 09: array_multisort($toshi,SORT_ASC, $shinchou,SORT_ASC, $array); 10: ?> と実行しましたが、 Array ( [0] => simei,toshi,shinchou [1] => taro,10,119 ・・・・と、print_r($array)の結果が出るだけで、ソートが出来ません。 CSVファイルで項目名(列名)が無い場合の並べ替えはどのようにすれば良いでしょうか。 mySQLなどを利用しないと並べ替えは出来ないでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
並べ替えのルールがはっきりしませんが、サンプルコードを見る限り、 まず年令順で並べ替えて同じ年令なら身長順にする、ということであっていますか? その場合、 <?php $data = "c:\××\××\shinchou.txt"; $array = file($data); $ret = array(); $toshi = array(); $shinchou = array(); foreach($array as $k=>$v){ $ret[$k] = explode(',', trim($v)); $toshi[$k] = $ret[$k][1]; $shinchou[$k] = $ret[$k][2]; } array_multisort($toshi,SORT_ASC,$shinchou,SORT_ASC,$ret); print_r($ret); ?> でいけると思いますよ。 サンプルコードがだめなのは、 ・$arrayが多次元になっていない ・print_r()の場所がarray_multisortより前になっている ・1行目にヘッダ行を挿入してもfileの返り値の配列のキーになるわけではない あたりですかね。
その他の回答 (1)
04: foreach($array as $key => $row){ 05: $toshi[$key] = $row["toshi"]; 06: $shinchou[$key] = $row["shinchou "]; 07: } とされていますが $array に toshi という連想配列を定義していませんよね? このままだと$toshi の中身は空っぽだと思うのですが・・・ やるのであれば 番号でやらないと・・・
お礼
ご回答頂きありがとうございました。
お礼
貴サンプルを動かしたら期待通りの結果を得ることが出来ました。 >サンプルコードがだめなのは、 >・$arrayが多次元になっていない 成程・・・、納得です。 貴サンプルを良く咀嚼するとともに、心して、再度、基礎知識の定着に努めることにします。ご指導有難うございました。