Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关联数组的自然排序?_Php_Arrays_Sorting - Fatal编程技术网

Php 关联数组的自然排序?

Php 关联数组的自然排序?,php,arrays,sorting,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 => arr

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

示例阵列:

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)
另一个示例阵列:

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\u multisort($array,SORT\u NATURAL),但由于关联数组的原因,这不起作用

那么,如何使用自然排序对内部数组进行排序呢?此外,在这种情况下,保留数组键并不重要

编辑:

阵列1的预期输出将相同(因为管理器1和管理器3已经就绪):

阵列2的预期产量将使1月提前于6月(“自然”顺序):

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

usort($array, function($a, $b){
    if ($a['manager'] == $b['manager']) {
        return 0;
    }
    return ($a['manager'] < $b['manager']) ? -1 : 1;
});
usort($array,function($a,$b){
如果($a['manager']=$b['manager']){
返回0;
}
回报($a[‘经理’]<$b[‘经理’])?-1:1;
});

对于月份排序,您可以使用类似于
date('m',strotime($a['month'])的内容来获取月份编号以进行比较。更多的方法可以在这里找到:

好吧!,您可以使用如下自然排序函数简化函数:

usort($array, function($a, $b){
    return strnatcmp($a['manager'],$b['manager']); //Case sensitive
    //return strnatcasecmp($a['manager'],$b['manager']); //Case insensitive
});
您可以使用usort()编写自己的比较函数。我从您的示例数组开始,然后将索引更改为字符串,以确保它正常工作。我已经用三种方法对它进行了测试,所有方法都有效,包括array_multisort(如果你不在乎你所说的键的话)


(注意:如果您最终需要这些键,您肯定必须使用array_键或uksort()执行自定义滚动路径)

是否要对每个内部数组进行排序?例如,您的第二个示例的预期输出是什么?添加了预期输出。这一个非常接近我所需要的,但我必须稍微修改它,以便处理更改的关联键(它们可能都不同,并且没有真正需要硬编码),最后的返回值变成:
returnstrnatcasecmp(reset($a),reset($b))
# 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);