我希望使用PHP按照第一个数字按升序排列数字。因此,对于以下输入数组:
$s = array( 11, 12, 13, 18, 23, 25, 34, 114 );
生成的有序数组应如下所示:
11 12 13 18 114 23 25 34 .. so on
答案 0 :(得分:2)
你的要求有点混乱,如果你想自然排序,那应该是
Array
(
[0] => 11
[7] => 114
[1] => 12
[2] => 13
[3] => 18
[4] => 23
[5] => 25
[6] => 34
)
如果您需要这样做,只需在sort
函数中使用sort_flags
- SORT_STRING
将项目作为字符串进行比较:
$s = array(11,12,13,18,23,25,34,114);
sort($s, SORT_STRING);
print_r($s);
注意:你能解释一下你18岁后如何带来114?
答案 1 :(得分:1)
从SO的陈述中,我认为它应该与两次比较进行比较,首先是第一位数字,然后是遗骸数字。
比较元素的第一个字符,然后比较剩余部分。您可以参考this来比较部分号码。
检查 live demo
<?php
$s = array(11,12,13,18,23,25,34,114);
usort($s, function($a, $b){
if(substr($a, 0, 1) < substr($b, 0, 1))
return -1;
if(substr($a, 0, 1) > substr($b, 0, 1))
return 1;
return substr($a, 1) - substr($b, 1);
});
print_r($s);
结果,
Array
(
[0] => 11
[1] => 12
[2] => 13
[3] => 18
[4] => 114
[5] => 23
[6] => 25
[7] => 34
)
答案 2 :(得分:0)
如果数字数组稍微改组并且包含更大的值以及重复数,那么代码应该在应用usort()之前预先排序数组,如下所示:
<?php
$s = [ 25, 12, 23, 1006, 13, 114, 11, 34, 18, 13, 112 ];
sort($s);
$func = function($a, $b){
$first_digitA = substr($a, 0, 1);
$first_digitB = substr($b, 0, 1);
if($first_digitA < $first_digitB){
return -1;
}
else
if( $first_digitA > $first_digitB ){
return 1;
}
else
{
return 0;
}
};
usort($s, $func);
print_r($s);
请参阅demo
在使用sort()按值预处理后,生成的数组如下所示:
[ 11, 12, 13, 13, 18, 23, 25, 34, 112, 114, 1006]
现在,可以成功应用带有回调的usort(),只要回调利用balanced ternary逻辑,可以在PHP的strcmp()中识别,这样“-1”表示该值$ a小于$ b,而“1”意味着$ a大于$ b。如果这些选择都不成立,那么$ a必须等于$ b,在这种情况下返回值为零。因此,比较仅限于检查传递给回调的每个数值对的第一个数字。
请注意,匿名函数定义与usort()不同,使用$ func作为参数,因为它的值包含用户定义的函数,所有这些都是为了提高易读性。