自然排序关联数组?

时间:2015-02-04 16:11:13

标签: php arrays sorting

给定一个数组数组,我如何根据它们的值自然地对内部数组进行排序?

示例数组:

array (size=2)
  0 => 
    array (size=1)
      'manager' => string 'Manager 1' (length=9)
  1 => 
    array (size=1)
      'manager' => string 'Manager 3' (length=9)

另一个示例数组:

array (size=2)
  0 => 
    array (size=1)
      'month' => string 'June' (length=4)
  1 => 
    array (size=1)
      'month' => string 'January' (length=7)

我的第一个想法只是natsort()他们,但这需要一个正常的数组。下一个想法是使用array_multisort($array, SORT_NATURAL);,但由于关联数组而无效。

那么,我如何使用自然排序对内部数组进行排序?此外,在这种情况下,保持数组键无关紧要。

编辑:

阵列1的预期输出将是相同的(因为Manager 1和Manager 3已经按顺序排列):

array (size=2)
  0 => 
    array (size=1)
      'manager' => string 'Manager 1' (length=9)
  1 => 
    array (size=1)
      'manager' => string 'Manager 3' (length=9)

第二阵列的预期输出将使1月份超过6月(“自然”顺序):

// 0 and 1 keys can switch or stay the same, doesn't matter
array (size=2)
  0 => 
    array (size=1)
      'month' => string 'January' (length=4)
  1 => 
    array (size=1)
      'month' => string 'June' (length=7)

3 个答案:

答案 0 :(得分:11)

嗯!你可以使用这样的自然排序函数简化函数:

usort($array, function($a, $b){
    return strnatcmp($a['manager'],$b['manager']); //Case sensitive
    //return strnatcasecmp($a['manager'],$b['manager']); //Case insensitive
});

答案 1 :(得分:1)

PHP usort()允许您定义用于排序的自定义回调函数:

usort($array, function($a, $b){
    if ($a['manager'] == $b['manager']) {
        return 0;
    }
    return ($a['manager'] < $b['manager']) ? -1 : 1;
});

对于分拣月份,您可以使用date('m', strtotime($a['month']))之类的内容来获取月份数进行比较。有更多方法可以在这里找到:convert month from name to number

答案 2 :(得分:0)

您可以使用usort()并编写自己的比较函数。我从你的示例数组开始,然后将索引更改为字符串,以确保它有效。我已经用三种方式对它进行了测试,所有这些方法都有效,包括array_multisort(如果你不关心你所说的键)。

# Quick, dirty, and probably not suitable for any use, anywhere, by anyone
$test1 = array();
$test1["zero"]="June";
$test1["one"] ="January";

function nat_cmp($a,$b){
        return strnatcmp($a,$b);
}

#usort($test1, 'nat_cmp'); # Returns {0=>"January",1=>"June"}
#usort($test1, function($a,$b){return strnatcmp($a,$b);}); # Same
array_multisort($test1, SORT_ASC, SORT_NATURAL); #Same

var_dump($test1);

(注意:如果你最终需要密钥,你肯定必须使用array_keys或uksort()去自定义滚动路径)