Сортировать массив PHP по другому порядку и дате - PullRequest
1 голос
/ 24 сентября 2011

Интересно, есть ли способ сортировки (usort или эквивалент) массива на основе порядка ключей другого массива и даты. Я знаю, как выполнять базовую сортировку дат с помощью 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 сортировалось по порядку $ котов и дате порядка $ prods

1 Ответ

1 голос
/ 24 сентября 2011

Обратите внимание на ваш низкий показатель принятия, поскольку он может удерживать людей от времени, чтобы ответить на ваши вопросы.Не забудьте пометить действительные ответы как принятые или иным образом опубликовать для них комментарий, объясняющий, почему они недействительны.

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