- ベストアンサー
csvファイルのタブで区切られた部分まで削除
csvファイルaを list($li_a,$li_b,$li_c,) = split("\t",$val); というようにタブで区切られた部分でリスト化しました。 配列の順番をabc順に並べようとして、 sortを使ったのですが、 一番初めの$li_aを基準に並べ変えられてしまいます。 $li_bを基準に並べ変えたい場合どうしたらよいのでしょうか。 csvファイルの一番初めのタブで区切られる部分まで削除という指示をすれば出来そうかなと思ったのですが、、、、。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
同じことですが、お礼の内容を踏まえて以下ではどうでしょうか? $li_bをキー値とする配列を作成して、ksortすれば良いかと思います。 「$li_b.(++$count)」は$li_bが重複した値を持つ場合に上書きされないようにする対処です。 ---- $count = 0; $result =array(); $example = file('a.csv'); foreach ($example as $val) { list($li_a,$li_b,$li_c) = split("\t",$val); $result[$li_b.(++$count)] = array($li_a,$li_b,$li_c); } ksort($result); ----
その他の回答 (3)
- masa6272
- ベストアンサー率66% (93/140)
繰返しで、回すこともないでしょう。 また、必要な部分を取り出す作業もいりますし。 こんなのでは? <?php $l = array('x3,3,y3','x0,0,y0','x1,1,y1','x2,2,y2'); $a = array_map('split', array_fill(0, count($l), ','), $l); usort($a, create_function('$x,$y', 'if($x[1] < $y[1]) return -1; else if($x[1] > $y[1]) return 1; else return 0;')); var_dump($a); ?> 最初の$lは、実際にはファイルから読みます。 ここでは、カンマ , で区切ってますが、タブ区切りならカンマの部分を書き直してください。
お礼
ありがとうございました^^
- masa6272
- ベストアンサー率66% (93/140)
<?php $a = array(array('x', 'b', 'y'),array('xx', 'a', 'yy')); var_dump(usort($a, create_function('$x,$y', 'if($x[1] < $y[1]) return -1; else if($x[1] > $y[1]) return 1; else return 0;'))); var_dump($a); ?> こんなんで、どうでしょう?
お礼
ありがとうございます、、、。 何度かやってみたのですが、うまくいかなかったので、 ほかの方法で実行しました。
- cyanberry
- ベストアンサー率50% (117/230)
配列がどういう構成になっているのか分からないので、質問の意味がいまいちわからないのですが・・・。 予想で回答しますが、以下のような感じでどうでしょうか。 ---- $result =array(); $fp = fopen ("a.csv", "r"); while (!feof($fp)) { $val = fgets($fp); list($li_a,$li_b,$li_c) = split("\t",$val); $result[$li_b] = array($li_a,$li_b,$li_c); } ksort($result); ---- $li_bの値が重複する可能性がある場合はこの方法ではダメです。 「$li_b+通し番号」をキーにするなどの工夫が必要です。
補足
配列はa.csvを $example = file('a.csv'); というようにし、 [0]=>一行目 [1]=>二行目 [2]=>三行目 というようにしてます。 一行目の真ん中の文字列を基準に並べ変えたいのですが、、、・
補足
ありがとうございました。 この方法でできましたー。