2016-06-15 6 views
0

は次のように多次元配列を考える:ソートPHP multidimesional配列:1つの昇順、1つのカスタム

$data = array (
[0] => array('aDate' => '2016-01-10', 'tType' => 'Added'), 
[1] => array('aDate' => '2016-01-20', 'tType' => 'RtrnCap'), 
[2] => array('aDate' => '2016-01-20', 'tType' => 'Removed'), 
[3] => array('aDate' => '2016-01-30', 'tType' => 'RtrnCap') 
); 

どこソートを:

$data = array (
[0] => array('aDate' => '2016-01-10', 'tType' => 'Added'), 
[1] => array('aDate' => '2016-01-30', 'tType' => 'RtrnCap'), 
[2] => array('aDate' => '2016-01-20', 'tType' => 'Removed'), 
[3] => array('aDate' => '2016-01-20', 'tType' => 'RtrnCap') 
); 

私はこれを取得するには、この配列をソートするにはどうすればよいです最初はaDateの昇順になり、2番目の並べ替えはtTypeというカスタムが次の順序でソートされます。Added、RtrnCap、Removed。

this SO questionのような複数のキーを使用して解決策を探し、this SO questionのような(匿名関数を使用して)usortを使用して、1つのカスタムキーをソートしました。これらはそれぞれソリューションの半分に過ぎません。 TWOソートの例では、通常の昇順または降順ソート順が使用されています(カスタム注文にする必要があります)。カスタムのusortの例は正常に動作しますが、唯一の値のセットです。

ボトムライン:私は2つの並べ替えが必要です。最初の並べ替えは、日付の昇順、2番目のカスタムです。

+0

@deceze作成したリソースを確認しました。それは包括的ですが、私は一緒にしようとしている2つの種類の組み合わせを見ていませんでした。トピックに私の新しいことを許してください、しかし私は2つの異なる種類を一緒に入れて助けを必要とします。 – globalSchmidt

+0

2つの条件による並べ替えは、**複数のフィールドによる並べ替え**セクションで説明されています。事前定義された順序での並べ替えについては、**手動の静的な並べ替え**を参照してください。これらの2つの手法を組み合わせるだけです。あなたの最善の試みと、それを実装する際の具体的な問題点を示してください。 – deceze

答えて

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

    $priority = array('Added' => 0, 'RtrnCap' => 1, 'Removed' => 2); 
    return ($priority[$a['tType']] < $priority[$b['tType']]) ? -1 : 1; 
}; 

usort($data, function ($a, $b) use ($typeSort) { 
    if ($a['aDate'] == $b['aDate']) { 
     return $typeSort($a, $b); 
    } 

    return ($a['aDate'] < $b['aDate']) ? -1 : 1; 
}); 
+0

ありがとうございます。いくつかの説明を追加できますか?通常の昇順の日付ソートがユーザー定義のソートになっているように見えますか?また、これをどのようにして第3の並べ替え、カスタムまたはノーマルに拡張するかもしれません。 – globalSchmidt

+0

2つ以上の列でソートすると、ユーザー定義のソートしか使用できません。まず、メイン列(aDate)でソートします。これは通常のソート関数ですが、両方の値が等しい場合、さらに深くなり、2番目の列(tType)でソートする必要があります。 3番目の列を追加する場合は、 '$ typeSort'関数の文字列' return 0; 'を別の列ソート関数に置き換えてください。 –

+0

パーフェクト。私は、位置配列の処理に2つの小さな調整を加えました。これは文字列の外部ソース配列なので、 '$ priority'を次のように設定しました:' $ custom_order_array = array( 'Added'、 'RtrnCap'、 'Removed'、...); $ priority = array_flip($ custom_order_array); '次に、これら二つのステートメントをtypeSort関数の外に移動し、' $ typeSort = function($ a、$ b)use($ priority); 'を設定します。 – globalSchmidt

関連する問題