按另一个数组顺序和日期对PHP数组排序


Sort a PHP array by another array order and date

想知道是否有一种方法来排序(ussort或equiv)基于另一个数组和日期的键顺序数组。我知道如何用usort做基本的日期排序,但我想知道你是否能同时做这两件事。

$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按$cats的类别顺序和$prods的日期顺序排序

注意你的低接受率,因为它会阻止人们花时间回答你的问题。请记住将有效的答案标记为可接受的,否则就发表评论,解释为什么这些答案无效。

这个解决方案在php 5.3+中工作得很好,如果你被困在旧版本中,你可以很容易地用调用strptime来替换DateTime对象。

没有指定位置的类别的产品被推到列表的末尾(参见示例中的product with 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"
  }
}