PHP排序多维数组与主要和&二级钥匙

时间:2010-10-19 12:58:06

标签: php arrays sorting multidimensional-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";

我希望将“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 个答案:

答案 0 :(得分:6)

使用像这样的用户:

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

)

答案 1 :(得分:2)

array_multisort()应该为您提供所需的功能...使用PHP文档中的示例#3作为排序的基础,尽管您需要在执行前将这些日期字符串转换为datestamp值那种。

如果此数据来自数据库查询,则在用于检索信息的sql查询中对其进行排序要容易得多。

答案 2 :(得分:1)

PHP没有内置函数来执行这样的复杂排序,因此您需要执行usort(),这允许您使用指定自己标准的函数对项目进行排序。 / p>

The example given on the PHP manual page几乎与您想要达到的目标完全匹配。

答案 3 :(得分:0)

您可以使用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发现更多信息 它应该可以帮助你开始。