PHP中的数组排序函数

时间:2011-04-18 01:43:55

标签: php arrays sorting

我定义了myArr = ("Apr","Mar","May")。是否有排序函数按自然月份序列对数组成员进行排序,否则按字母表排序。

数组成员变量可以在运行时更改。

我希望输出跟随 3月,4月,5月使用foreach循环。

3 个答案:

答案 0 :(得分:2)

您可以使用usort()并创建自己的函数来比较月份。

function monthCompare($a, $b)
{
  $months = array('jan' => 1, 'feb' => 2..._);
  if($a == $b)
  {
    return 0;
  }
  return ($months[$a] > $months[$b]) ? 1 : -1;
}

答案 1 :(得分:1)

在@ preinheimer的回答中建立一个版本,如果名称不存在,这个版本将进行顺序排序:

$data = array("Apr", "Mar", "Jan", "Feb", "ddd", "aaa", "ccc");

function monthCompare($a, $b) {
    $a = strtolower($a);
    $b = strtolower($b);
    $months = array(
        'jan' => 1,
        'feb' => 2,
        'mar' => 3,
        'apr' => 4,
        'may' => 5
    );
    if($a == $b)
        return 0;
    if(!isset($months[$a],$months[$b]))
        return $a > $b;
    return ($months[$a] > $months[$b]) ? 1 : -1;
}

usort($data, "monthCompare");

echo "<pre>";
print_r($data);

返回:

Array
(
    [0] => aaa
    [1] => ccc
    [2] => ddd
    [3] => Jan
    [4] => Feb
    [5] => Mar
    [6] => Apr
)

但是 - 这突出了你的问题的逻辑缺陷。您已经要求按月份顺序排序,否则按字母排序。问题在于您没有以可靠的方式定义排序顺序。例如,使用上面的algorythm和数组"ddd", "aaa", "ccc", "Apr", "Mar", "Jan", "Feb"(即相同的元素)给出结果:

Array
(
    [0] => aaa
    [1] => Jan
    [2] => Feb
    [3] => Mar
    [4] => Apr
    [5] => ccc
    [6] => ddd
)

根据您的要求,这两个答案都是正确的,因此您需要更详细地定义排序要求。

答案 2 :(得分:0)

没有。没有这样的功能。 但是 ....你仍然可以优雅地解决你的问题。您应该将月份名称与数字相关联(1表示1月,2表示2月,依此类推)。这是编程中最常用的方法。

将数组定义为:

$myArr = array(1=>"Jan", 2=>"Feb" ... )

然后你可以按键(ksort)对你的$ myArr进行排序:

ksort($myArr);
var_export($myArr);

这会按键按升序对数组进行排序。