PHP多维数组按主键和次要键排序

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

我希望将'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";

如何实现这个呢?

1
这些数据是来自数据库吗?也许你可以通过修改原始查询来按正确顺序检索数据。 - nnevala
数据库中的数据不足,无法完成此操作 :-( - Riccardo
4个回答

6

像这样使用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
        )

)

会的,因为它在“prio”相等时比较日期。 - Toto

3
array_multisort() 可以提供您所需的功能...请使用 PHP 文档中的示例 #3 作为您排序的基础,但在执行排序之前,您需要将这些日期字符串转换为日期时间戳值。
如果这些数据来自数据库查询,那么在检索信息时在 sql 查询中对其进行排序要容易得多。

1

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

PHP手册页面上给出的示例几乎完全符合您想要实现的内容。


@Riccardo:usort允许您指定任何排序标准;您可以使用它来对任何一个或多个嵌套数组元素进行排序。您只需要编写一个函数,该函数返回小于零或大于零的值,具体取决于您希望将数组中的任何两个给定元素中的哪一个排序更高。您可以按照您喜欢的任意数量的“列”进行排序;您只需编写函数即可。请参见@M42的示例以证明。 - Spudley

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/zh/function.usort.php找到。
这应该能帮助你入门。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接