2011-09-23 11 views
1

別の配列と日付のキー順に基づいて配列をソート(ソートまたは等価)する方法があるのだろうかと思っていました。私はusortを使って基本日付の並べ替えを行う方法を知っていますが、両方を1回で行うことができるのだろうかと思っていました。他の配列と日付でPHP配列をソート

$cats = array(1,6,3,4,7,2); 
$prods = array(
array('cat'=>1,'date'=>'1/3/2011'), 
array('cat'=>2,'date'=>'1/6/2011'), 
array('cat'=>3,'date'=>'2/3/2011') 
); 

は、私はそれがあなたの質問に答えるために時間を割いてから人々を阻止することができますとして$猫と$の日付順のカテゴリ順にソートPRODSは、あなたの低受け入れ率に

+2

あなたのデータ構造を少し微調整する必要があるかもしれませんが、あなたは[ 'array_multisort']でこれを達成することができる必要があります(http:// WWW –

+1

あなたはどんな種類のソートが必要なのか理解できませんし、有効なコードでもないのです –

+0

arr2ではidが一意ではないと思いますか? –

答えて

1

ご注意をPRODS $をしたいです。有効な回答は受け入れられたものとしてマークするか、そうでない場合はその理由を説明するコメントを投稿してください。

このソリューションはPHP 5.3以降で正常に動作します。古いバージョンに閉じ込められている場合、簡単にDateTimeオブジェクトをstrptimeの呼び出しで置き換えることができます。

位置が指定されていないカテゴリの製品はリストの最後にプッシュされます(この例ではcat == 42の製品を参照)。

$cats = array(1,6,3,4,7,2); 

// added a few products to test the date sorting 
$prods = array(
    array('cat'=>1,'date'=>'3/3/2011'), 
    array('cat'=>1,'date'=>'2/3/2011'), 
    array('cat'=>1,'date'=>'1/3/2011'), 
    array('cat'=>42,'date'=>'2/3/2011'), 
    array('cat'=>2,'date'=>'1/3/2011'), 
    array('cat'=>2,'date'=>'2/3/2011'), 
    array('cat'=>2,'date'=>'1/6/2011'), 
    array('cat'=>3,'date'=>'2/3/2011') 
); 

// need an index of category_id => position wanted in the sort 
$r_cats = array_flip($cats); 
// if the category of a product is not found in the requested sort, we will use 0, and product with category id 0 will be sent to the end of the sort 
$r_cats[0] = count($r_cats); 
// this one is needed for DateTime, put whatever your timezone is (not important for the use we do of it, but required to avoid a warning) 
date_default_timezone_set('Europe/Paris'); 

usort($prods, function($a, $b) use($r_cats) { 
    $cat_a = isset($r_cats[$a['cat']]) ? $r_cats[$a['cat']] : $r_cats[0]; 
    $cat_b = isset($r_cats[$b['cat']]) ? $r_cats[$b['cat']] : $r_cats[0]; 

    if ($cat_a < $cat_b) { 
    return -1; 
    } elseif ($cat_a > $cat_b) { 
    return 1; 
    } 

    $date_a = DateTime::createFromFormat('j/n/Y', $a['date']); 
    $date_b = DateTime::createFromFormat('j/n/Y', $b['date']); 

    if ($date_a < $date_b) { 
    return -1; 
    } elseif ($date_a > $date_b) { 
    return 1; 
    } 

    return 0; 
}); 

var_dump($prods); 

結果は以下の通りです:

array(8) { 
    [0]=> 
    array(2) { 
    ["cat"]=> 
    int(1) 
    ["date"]=> 
    string(8) "1/3/2011" 
    } 
    [1]=> 
    array(2) { 
    ["cat"]=> 
    int(1) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
    [2]=> 
    array(2) { 
    ["cat"]=> 
    int(1) 
    ["date"]=> 
    string(8) "3/3/2011" 
    } 
    [3]=> 
    array(2) { 
    ["cat"]=> 
    int(3) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
    [4]=> 
    array(2) { 
    ["cat"]=> 
    int(2) 
    ["date"]=> 
    string(8) "1/3/2011" 
    } 
    [5]=> 
    array(2) { 
    ["cat"]=> 
    int(2) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
    [6]=> 
    array(2) { 
    ["cat"]=> 
    int(2) 
    ["date"]=> 
    string(8) "1/6/2011" 
    } 
    [7]=> 
    array(2) { 
    ["cat"]=> 
    int(42) 
    ["date"]=> 
    string(8) "2/3/2011" 
    } 
} 
+0

ありがとう@Lepidosteus。私はポスターに応答する時間を取って改善することに取り組んでいます。私は<5.3だが、あなたがここでやっていることを得て、それを機能させることができた。 – daxiang28