Обратите внимание на ваш низкий показатель принятия, поскольку он может удерживать людей от времени, чтобы ответить на ваши вопросы.Не забудьте пометить действительные ответы как принятые или иным образом опубликовать для них комментарий, объясняющий, почему они недействительны.
Это решение отлично работает в 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"
}
}