数字上升顺序由第一数字

时间:2017-05-24 09:04:43

标签: php arrays sorting

我希望使用PHP按照第一个数字按升序排列数字。因此,对于以下输入数组:

$s = array( 11, 12, 13, 18, 23, 25, 34, 114 );

生成的有序数组应如下所示:

11 12 13 18 114 23 25 34 .. so on

3 个答案:

答案 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作为参数,因为它的值包含用户定义的函数,所有这些都是为了提高易读性。