2012-07-29 15 views
5

私は、次の配列があります。複数種類

Array 
(
[0] => Array 
    (
     [note] => test 
     [year] => 2011 
     [type] => football 
    ) 

[1] => Array 
    (
     [note] => test1 
     [year] => 2010 
     [type] => basket 
    ) 

[2] => Array 
    (
     [note] => test2 
     [year] => 2012 
     [type] => football 
    ) 

[3] => Array 
    (
     [note] => test3 
     [year] => 2009 
     [type] => basket 
    ) 

[4] => Array 
    (
     [note] => test4 
     [year] => 2010 
     [type] => football 
    ) 

) 

をそして私は、第1のタイプにより、別の配列に従って、それをソートしたいと思います。たとえば

:その後$sort = array('football','basket');

とすることにより、年。

どうすればいいですか?

ありがとうございました。

所望の出力は次のようになります。私たちはインデックス値をリセットする場合、私は気にしない

Array 
(
[2] => Array 
    (
     [note] => test2 
     [year] => 2012 
     [type] => football 
    ) 
[0] => Array 
    (
     [note] => test 
     [year] => 2011 
     [type] => football 
    ) 
[4] => Array 
    (
     [note] => test4 
     [year] => 2010 
     [type] => football 
    ) 

[1] => Array 
    (
     [note] => test1 
     [year] => 2010 
     [type] => basket 
    ) 

[3] => Array 
    (
     [note] => test3 
     [year] => 2009 
     [type] => basket 
    ) 

) 

ありがとうございました。

答えて

2

使用array_multisort。あなたの配列が$arrであると仮定すると:

foreach($arr as $key=>$row) { 
    $type[$key] = $row['type']; 
    $year[$key] = $row['year']; 
} 
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr); 

あなたができるタイプの順序を指定addictional配列を、使用するには:

$sortBy = array('football','basket'); 
foreach($arr as $key=>$row) { 
    $type[$key] = array_search($row['type'],$sortBy); 
    $year[$key] = $row['year']; 
} 
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr); 

例リンク:

http://codepad.org/qhZCpbZE

+0

ありがとうございました。しかし、どうすれば$ sortBy配列も含めることができますか? – glarkou

+0

@サラミス私もそれをカバーする私の答えを編集しました。 – lafor

+0

おかげで期待通りに動作するようです。簡単な質問です別の配列でソートする場合、 '$ type、SORT_ASC'を使用するのはなぜですか? – glarkou

1

利用

function byType($a, $b) 
{ 
    if ($a['type'] == $b['type']) { 
     return 0; 
    } 

    foreach(array('football','basket') as $type) { 
     if ($a['type']=$type) return -1; 
     if ($b['type']=$type) return 1; 
    } 

    return 0; 
} 


function byYear($a, $b) 
{ 
    if ($a['year'] == $b['year']) { 
     return 0; 
    } 
    return ($a['year'] < $b['year']) ? -1 : 1; 
} 

usort($array,"byType"); 
usort($array,"byYear"); 
+0

これは動作していません。まず、別の配列を使用して型で並べ替えることができないためです。第2に、第2のソートが実行されると、すべてが再び混合されます。 http://codepad.org/PO3CvGsuと目的の結果を確認してください。タイプが同じである場合にのみ、年ごとの並べ替えが発生するようにしたいと思います。 – glarkou

+0

それは働いています。 http://codepad.org/PwYKyyMS – Adi

+0

@Adnanそれは動作しません、配列を変更する、それは現在 "運"によって動作します – Leigh

4

はPHPのバージョンが必要ですそのままで実行するとクロージャをサポートします

セカンダリ配列は、ソート自体の外側で定義することができます。クロージャをサポートできない場合は、これを直接ソートルーチンに入れることができます。

$sortBy = array('football', 'basket'); 

ソートルーチン。

種類が同じ場合はソートされ、それ以外の場合は$sortBy配列の型によってソートされます。

usort($a, function($a, $b) use ($sortBy) { 
    if ($a['type'] == $b['type']) { 
     return ($b['year'] - $a['year']); 
    } 
    $typeOrder = array_flip($sortBy); 
    return $typeOrder[$a['type']] - $typeOrder[$b['type']]; 
}); 
+0

これはどのように使用できますか?私はhttp://codepad.org/HCodcfglを試みたが、それは仲間を働かせていないようだ。ご協力いただきありがとうございます。 – glarkou

+0

@salamis CodepadはPHP 5.2(6歳)で、クロージャをサポートしていません。 **あなたが使用しているPHPのバージョンは何ですか? ([Viper 7のコードパッドも使用できます](http://codepad.viper-7.com/MpTYaB)) – Leigh