给定一个数组数组,如何根据内部数组的值对其进行自然排序?
示例阵列:
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的预期输出将是相同的(因为管理器1和管理器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)
好吧!,您可以使用以下自然排序函数来简化函数:
usort($array, function($a, $b){
return strnatcmp($a['manager'],$b['manager']); //Case sensitive
//return strnatcasecmp($a['manager'],$b['manager']); //Case insensitive
});
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']))
的方法来获取月份编号以进行比较。更多的方法可以在这里找到:将月份从名称转换为数字
您可以使用usort()并编写自己的比较函数。我从您的示例数组开始,然后将索引更改为字符串,以确保它有效。我已经测试了三种方法,所有方法都有效,包括array_multiport(如果你不像你说的那样关心密钥的话)。
# 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()的自定义滚动路径)