PHP sort multidimensional array with primary & sec

2020-03-23 18:05发布

How do you sort a multidimensional array by primary and secondary key? For example, assuming the following array:

$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";

I wish to sort the column 'prio' as the primary key (ascending) and 'date' as the secondary key (descending), to obtain:

$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";

How to achieve this?

4条回答
Anthone
2楼-- · 2020-03-23 18:41

PHP doesn't have a built-in function to do complex sorting like this, so you'll need to do a usort(), which allows you to sort items using a function that specifies your own criteria.

The example given on the PHP manual page is almost an exact match for what you want to achieve.

查看更多
▲ chillily
3楼-- · 2020-03-23 18:49

array_multisort() should give you the functionality that you need... use Example #3 from the PHP documentation as the basis for your sort, although you'll need to convert those date strings to a datestamp value before executing the sort.

If this data has come from a database query though, it's far easier to sort it within the sql query used to retrieve the information.

查看更多
Juvenile、少年°
4楼-- · 2020-03-23 18:57

Use usort like this:

$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);

Output:

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
        )

)
查看更多
戒情不戒烟
5楼-- · 2020-03-23 19:05

You may use usort() to define custom sort function.
Here's an example

<?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";
}
?>

The output will be

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

More info can be found at http://www.php.net/manual/en/function.usort.php
It should help you get started.

查看更多
登录 后发表回答