2011-12-28 8 views
1

北、東、南または西の値を含む配列を持っています。配列をソートで並べ替え

たとえば、南、西、北の順に値を持つ配列があります。

今、北、東、南、西のような配列をソートしたいと思います。

私の例では、値はこの順序でなければなりません:北、南、西。

どうすればいいですか?

ありがとうございます!

+0

これまでに行ったことをいくつか追加してください。たとえそれが配列の定義だけであっても。そして、あなたが問題に悩まされている箇所を強調することもできます。 – hakre

+0

[配列の並べ替え機能の比較](http://www.php.net/manual/en/array.sorting.php)が非常に役に立ちます。 – hakre

+0

もう少し詳しく説明できますか?なぜこの方法でソートしたいのですか?あなたは何をしようとしているのですか?今のように、なぜあなたはそれが含まれている必要があるかを知っているので、あなたが望むようにソートした配列を作成しないのはなぜですか? –

答えて

6

また、array_intersect()を使用することもできます。最初の配列の順序が保持されます。すべての基本方向の配列を最初のパラメーターとして正しい順序で、配列を2番目のパラメーターとして並べ替えます。

$cardinals = array('north', 'east', 'south', 'west'); 
$input = array('south', 'west', 'north'); 

print_r(array_intersect($cardinals, $input)); 
+0

ありがとう、それは動作します! – Jordy

+0

興味深いことに、私は3つのことが好きです(少なくとも)、それは簡潔です*しかし、また非常に明確で、コールバックを使用せず、コールバックソリューションとして拡張可能(北東などを追加する必要がある場合)です。ニート! – zrvan

+0

はい、非常にきれいです。キーでソートする必要がある場合は、['array_intersect_key'](http://php.net/array_intersect_key)もあります。 – hakre

0

あなたはこの線に沿って何か(私はそれがサミュエル・ロペスもコメントで示唆されているものだと信じて)行うことができます:これは、その数の各方向と種類に番号を割り当て

$arr = array ('north', 'west', 'south', 'east',); 

function compass_sort ($a, $b) 
{ 
     $cmptable = array_flip (array (
       'north', 
       /* you might want to add 'northeast' here*/ 
       'east', 
       /* and 'southeast' here */ 
       'south', 
       'west', 
     )); 

     $v1 = trim (mb_strtolower ($a)); 
     $v2 = trim (mb_strtolower ($b)); 

     if (! isset ($cmptable[$v1]) 
      || ! isset ($cmptable[$v2])) 
     { 
       /* error, no such direction */ 
     } 

     return $cmptable[$v1] > $cmptable[$v2]; 
} 

usort ($arr, 'compass_sort'); 

を、northには0が割り当てられ、eastとなります(間に何かを追加しない限り)。