こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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などを利用しないと並べ替えは出来ないでしょうか。

投稿日時 - 2009-07-12 14:52:18

QNo.5119379

困ってます

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

並べ替えのルールがはっきりしませんが、サンプルコードを見る限り、
まず年令順で並べ替えて同じ年令なら身長順にする、ということであっていますか?

その場合、
<?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の返り値の配列のキーになるわけではない
あたりですかね。

投稿日時 - 2009-07-13 17:12:31

お礼

貴サンプルを動かしたら期待通りの結果を得ることが出来ました。
>サンプルコードがだめなのは、
>・$arrayが多次元になっていない

成程・・・、納得です。
貴サンプルを良く咀嚼するとともに、心して、再度、基礎知識の定着に努めることにします。ご指導有難うございました。

投稿日時 - 2009-07-14 23:01:33

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

04: foreach($array as $key => $row){
05: $toshi[$key] = $row["toshi"];
06: $shinchou[$key] = $row["shinchou "];
07: }

とされていますが
$array に toshi という連想配列を定義していませんよね?
このままだと$toshi の中身は空っぽだと思うのですが・・・

やるのであれば 番号でやらないと・・・

投稿日時 - 2009-07-12 18:18:34

お礼

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

投稿日時 - 2009-07-14 22:38:15

あなたにオススメの質問