▽1
●
tobeoscontinue ベストアンサー |
<?php function str_putcsv($csv, $c=',', $t="\n") { return implode($c, $csv).$t; } $csv = array_map('str_getcsv', file('a.csv')); usort($csv, function ($a, $b) { if ($a[1] == $b[1]) return $a[0] == $b[0] ? 0 : ($a[0] < $b[0] ? -1 : 1); else return $a[1] < $b[1] ? -1 : 1; }); file_put_contents('b.csv', array_map('str_putcsv', $csv));
>一番目に2列目を優先し 2番目に一列目を優先してソート
http://q.hatena.ne.jp/1465834502にあるcallback関数の部分を書き換えます。
$a[1] == $b[1]の2列目が等しい場合のみ一列目の$a[0] == $b[0]を調べます。
また1列目、2列目は文字列なのでstrcmpを使ったほうがコードはすっきりします。
ただ数値が二桁以上だと正しく比較できません。
usort($csv, function ($a, $b) {
$c = strcmp($a[1], $b[1]);
return $c == 0 ? strcmp($a[0], $b[0]) : $c;
}
csv配列を文字列化するためにstr_putcsvとしました。
array_map('str_putcsv', $csv)の返値は配列なのですがfile_put_contentsが
全ての要素を出力してくれます。