ご注意を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"
}
}
あなたのデータ構造を少し微調整する必要があるかもしれませんが、あなたは[ 'array_multisort']でこれを達成することができる必要があります(http:// WWW –
あなたはどんな種類のソートが必要なのか理解できませんし、有効なコードでもないのです –
arr2ではidが一意ではないと思いますか? –