質問: こんにちは。お世話になります。 PHPの学習をしています。 あるcsvファイルがあります。データは以下の形式で、200行ほどあります。 名前、住所、年齢 さとう 東京 20 すずき 東京 20 たなか 埼玉 19 うえの 千葉 18 まき 神奈川 22 たかだ 東京 21 : : このcsvファイルを、 ・名前が2文字である人物の行をすべて削除したうえで、 ・年齢を下り順にソートして、 ・同じ住所を持つ人物ごとにcsvファイルを作成して保存したい と思います。 csvファイルを読み込ませるのはできましたし、カンマ区切りで多次元配列に分解することもできましたが、その先がわかりません。 特に名前が2バイト文字で2文字であることを判別する方法と、多次元配列を下り順にソートすることができなくて、戸惑っています。 同じ住所もIF関数で無理やり場合分けしたりして、もっとスマートなやり方があるんじゃないかと思います。 PHPに詳しい方、どうか力をお貸しください。 お読みくださってありがとうございました。どうかよろしくお願いします。 ```
回答: 依頼者は自己解決したそうですが、いちおう記録としてPHPでの解決方法を残しておきます。 配列ごとにグループ化するまでです。 ``` $csv=file_get_contents('text.csv'); $data=array(); $rows = explode("\r\n",$csv); foreach($rows as $r){ list($name,$address,$age) = explode(',',$r); //名前3文字以上 if(mb_strlen($name) >= 3){ $ary_name[] = $name; $ary_addr[] = $address; $ary_age[] = $age; $data[] = [$name,$address,$age]; } } array_multisort($ary_age,SORT_NUMERIC,SORT_DESC,$data); //年齢別ソート $data2 = group_by($data,1); //グループ化 //$data3 = array_values($data2); //必要ならば、インデックスに直す。 //再帰的にグループ化する関数(qiitaより) function group_by( $table, $key): array { return array_reduce($table, function ($groups, $row) use ($key) { $groups[$row[$key]][] = $row; return $groups; }, []); } ```