对一个二维数组的行进行自然排序

6

假设有一个包含多个数组的数组,如何根据它们的值对内部数组进行自然排序?

示例数组:

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)

数组二的预期输出将把一月排在六月之前('自然'顺序):

// 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)

你想对每个内部数组进行排序吗?例如,你对第二个示例的期望输出是什么? - Hilder Vitor Lima Pereira
1
添加了预期输出。 - Samsquanch
3个回答

23

好的!您可以使用自然排序函数来简化函数,例如:

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

这个代码片段非常接近我所需的,但是我稍微修改了一下以处理不断变化的关联键(它们可能都不同,并且没有必要硬编码它们),因此最终的返回值变成了:return strnatcasecmp(reset($a),reset($b)); - Samsquanch

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']))的方式获取月份数字进行比较。更多实现方法可以在此处找到:将月份从名称转换为数字


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()进行自定义滚动路径)


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