【问题标题】:Ascending Order of Numbers By First Digit按第一位数字升序排列
【发布时间】:2017-05-24 09:04:42
【问题描述】:

我想要一个使用 PHP 根据第一位数字升序排列的数字数组。因此,对于以下输入数组:

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

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

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

【问题讨论】:

  • 将数组中的值转换为字符串,然后对其进行排序
  • 它应该在第一个数字上对值进行词法排序,然后对其余数字进行数字排序......?即,它必须是11, 12, 114,而不是更典型的11, 114, 12...?这看起来……很奇怪。
  • 参考this
  • 可能是你想比较第一个数字,然后是数字的剩余部分。

标签: php arrays sorting


【解决方案1】:

你的要求有点混乱,如果你想自然排序,应该是

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 的吗?

【讨论】:

  • 这就是我发的@KrisRoofe,为什么需要eval来验证?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果数字数组更加混乱并包含更大的值以及重复项,则代码应在应用 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]
    

    现在,如果回调利用balanced ternary 逻辑,则可以成功应用带有回调的 usort(),这在 PHP 的 strcmp() 中可以识别,例如“-1”表示 $ 的值a 小于 $b,而“1”表示 $a 大于 $b。如果这些选择都不为真,那么 $a 必须等于 $b 在这种情况下返回值为零。因此,比较将自身限制为仅检查传递给回调的每对数字值的第一个数字。

    请注意,匿名函数定义与 usort() 不同,而是使用 $func 作为参数,因为它的值包含用户定义的函数,所有这些都是为了提高易读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2016-07-05
      • 2015-10-12
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多