プロが教えるわが家の防犯対策術!

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

A 回答 (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の返り値の配列のキーになるわけではない
あたりですかね。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2009/07/14 23:01

04: foreach($array as $key => $row){


05: $toshi[$key] = $row["toshi"];
06: $shinchou[$key] = $row["shinchou "];
07: }

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

やるのであれば 番号でやらないと・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/14 22:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!