PHP сортирует многомерный массив с первичными и вторичными ключами - PullRequest
5 голосов
/ 19 октября 2010

Как вы сортируете многомерный массив по первичному и вторичному ключу? Например, предположим, что следующий массив:

$result = array();

$result[0]["prio"] = 1;
$result[0]["date"] = '2010-02-28';
$result[0]["post"] = "February's thoughts";

$result[1]["prio"] = 0;
$result[1]["date"] = '2010-04-20';
$result[1]["post"] = "April's thoughts";

$result[2]["prio"] = 0;
$result[2]["date"] = '2010-05-30';
$result[2]["post"] = "May's thoughts";

Я хочу отсортировать столбец 'prio' как первичный ключ (по возрастанию) и 'date' как вторичный ключ (по убыванию) , чтобы получить:

$result[0]["prio"] = 0;
$result[0]["date"] = '2010-05-30';
$result[0]["post"] = "May's thoughts";
$result[1]["prio"] = 0;
$result[1]["date"] = '2010-04-20';
$result[1]["post"] = "April's thoughts";
$result[2]["prio"] = 1;
$result[2]["date"] = '2010-02-28';
$result[2]["post"] = "February's thoughts";

Как этого добиться?

Ответы [ 4 ]

6 голосов
/ 19 октября 2010

Используйте usort следующим образом:

$result = array();

$result[0]["prio"] = 1;
$result[0]["date"] = '2010-02-28';
$result[0]["post"] = "February's thoughts";

$result[1]["prio"] = 0;
$result[1]["date"] = '2010-04-20';
$result[1]["post"] = "April's thoughts";

$result[2]["prio"] = 0;
$result[2]["date"] = '2010-05-30';
$result[2]["post"] = "May's thoughts";

function fct($a ,$b) {

  if ($a['prio'] < $b['prio']) {
    return -1;
  } elseif  ($a['prio'] > $b['prio']) {
    return 1;
  } else {
    return strcmp($b['date'], $a['date']);
  }

}

usort($result, "fct");
print_r($result);

Выход:

Array
(
    [0] => Array
        (
            [prio] => 0
            [date] => 2010-05-30
            [post] => May's thoughts
        )

    [1] => Array
        (
            [prio] => 0
            [date] => 2010-04-20
            [post] => April's thoughts
        )

    [2] => Array
        (
            [prio] => 1
            [date] => 2010-02-28
            [post] => February's thoughts
        )

)
2 голосов
/ 19 октября 2010

array_multisort () должен предоставить вам необходимую функциональность ... используйте Пример # 3 из документации PHP в качестве основы для вашей сортировки, хотя вам необходимо преобразовать эти строки даты в значение datetamp перед выполнением сортировки.

Если эти данные получены из запроса к базе данных, то их гораздо проще отсортировать в запросе sql, используемом для получения информации.

1 голос
/ 19 октября 2010

PHP не имеет встроенной функции для такой сложной сортировки, поэтому вам нужно выполнить usort(), которая позволяет сортировать элементы, используя функцию, которая задает собственные критерии.

Пример, приведенный на странице справки PHP , является почти точным соответствием того, чего вы хотите достичь.

0 голосов
/ 19 октября 2010

Вы можете использовать usort() для определения пользовательской функции сортировки.
Вот пример

<?php
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>

Выход будет

0: 1
1: 2
2: 3
3: 5
4: 6

Более подробную информацию можно найти на http://www.php.net/manual/en/function.usort.php
Это должно помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...