【问题标题】:Natural sort an associative array?自然排序关联数组?
【发布时间】:2015-04-04 06:00:58
【问题描述】:

给定一个数组数组,我如何根据内部数组的值自然排序?

示例数组:

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)

数组 2 的预期输出将 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)

【问题讨论】:

  • 您要对每个内部数组进行排序吗?例如,您的第二个示例的预期输出是什么?
  • 添加了预期的输出。

标签: php arrays sorting


【解决方案1】:

您可以使用 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() 进行自定义滚动路径)

【讨论】:

    【解决方案2】:

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

    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));
    【解决方案3】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 2019-04-23
      • 1970-01-01
      • 2011-02-26
      • 2017-05-04
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多