【问题标题】:PHP sort multidimensional array with primary & secondary keysPHP使用主键和辅助键对多维数组进行排序
【发布时间】:2011-04-27 11:33:38
【问题描述】:

如何按主键和辅助键对多维数组进行排序? 例如,假设如下数组:

$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”列作为主键(升序)和“日期”作为副键(降序)进行排序,以获得: p>

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

如何做到这一点?

【问题讨论】:

  • 此数据是否来自数据库?也许您可以通过修改原始查询以正确的顺序检索数据。
  • 没有足够的数据库数据来实现这一点:-(

标签: php arrays sorting multidimensional-array


【解决方案1】:

像这样使用 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”相等的日期。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • @Riccardo:usort 允许您指定任何排序标准;您可以使用它对任何一个或多个嵌套数组元素进行排序。您所要做的就是编写一个返回小于零或大于零的函数,具体取决于您想要排序更高的数组中两个给定元素中的哪一个。您可以根据需要对任意数量的“列”进行排序;您只需编写函数代码即可。请参阅@M42 的示例以获得证明。
    【解决方案4】:

    您可以使用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
    它应该可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多