• 締切済み

配列を指定した順序でソート

以下のような県名が入っている配列があるとします。 $prefecture = array('京都府', '兵庫県', '北海道', '埼玉県', '大阪府', '岩手県', '広島県','愛知県', '新潟県', '東京都', '神奈川県'); これを日本地図の一番上にある北海道から順番に並べ替えたいとする場合、どのような方法があるでしょうか? 今回は県名を用いましたが、ようするに自分の意図した順番に並べ替えたいということなんですが、Googleで検索したりしてもうまく見つかりませんでした。

みんなの回答

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

え → お → い → う → あ というのが、規則ですよね? この規則は、どうやって与えるんですか? $rule = array('え', 'お', 'い', 'う', 'あ'); でよければ、 function compareWithMyrule($a, $b) { $rule = array('え', 'お', 'い', 'う', 'あ'); $ruleFlipped = array_flip($rule); if($ruleFlipped[$a] == $ruleFlipped[$b]) return 0; return ($ruleFlipped[$a] < $ruleFlipped[$b]) ? -1 : 1; } という比較関数を書けば、いいでしょう。 array('え' => 0, 'お' => 1, 'い' => 2, 'う' => 3, 'あ' =>4); を最初から作ってもかまいませんが、こっちの方が見やすいのでは。 この配列は、関数内で毎回計算するのも無駄ですので、一度外で計算してglobalで使った方が効率はよさそうです。

すると、全ての回答が全文表示されます。
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

前の投稿ですが、ユーザが書けるというところを強調したかったんで、システムの関数を使っても、O.K. <?php $a = array(7,65,543,4321,3333); sort($a); var_dump($a); usort($a, 'strcmp'); var_dump($a); ?> 誤解されそうなんで。

php_rookey
質問者

補足

ありがとうございます。 そのような関数があったのですね。 でも、私がしたいことは一定の規則に従ってソートするのではなく、 あらかじめ決めておいた順番に並べ替えたいのです。 例えば、 $a = array('あ', 'い', 'う', 'え', 'お'); という配列があって、その順番を自分が決めたように、 え → お → い → う → あ としたいと言えばいいでしょうか。

すると、全ての回答が全文表示されます。
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

並び替えを行うには、順序を判定する必要があります。都道府県に関しては、yambejp さんの言うように、JISコードをキーに持つというのも手かもしれませんね。JISコードの存在は知れませんでした。これって、県庁の緯度順ですか? 一般的には、ユーザが順序を判定する関数を書いて、それを使ってソートをします。そのための関数がusortです。 たとえば、整数の配列を文字列としてソートしたいとします。この時、そのまま比較すると、数値としての順になります。文字列として比較したい時には次のようにします。 <?php function compareAsString($x, $y) {   if($x == $y) {     return 0;   }   return ('a' . $x < 'a' . $y) ? -1 : 1; } $a = array(7,65,543,4321,3333); sort($a); var_dump($a); usort($a, 'compareAsString'); var_dump($a); ?> compareByString()が大小比較を行うユーザー定義関数です。第1引数が第2引数より小さければ-1、等しければ0、大きければ1を返すように書きます。 PHPに限らず、類似の関数は他の言語にも結構あります。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

都道府県にはJIS番号が付いています。 なのでキーにあらかじめJIS番号を振っておけばksortでいけます。 <? $prefecture = array( 26=> '京都府' , 28=>'兵庫県' , 1=>'北海道' , 11=>'埼玉県' , 27=>'大阪府' , 3=>'岩手県' , 34=>'広島県' , 22=>'愛知県' , 16=>'新潟県' , 13=>'東京都' , 14=>'神奈川県' ); print_r($prefecture ); ksort($prefecture ); print_r($prefecture ); ?>

php_rookey
質問者

補足

ありがとうございます。 説明が悪くてすいません。 都道府県を用いた場合は例えばの話だったので、実際は違う文字列をソートしたいのです。

すると、全ての回答が全文表示されます。

関連するQ&A