【问题标题】:PHP adding leading 0 to rangePHP将前导0添加到范围
【发布时间】:2009-12-02 03:05:08
【问题描述】:

如何让它为 1-9 渲染前导 0?

<?php foreach (range(1, 12) as $month): ?>


                  <option value="<?=$month?>"><?=$month?></option>

                <?php endforeach?>

【问题讨论】:

  • 将选项的文本重复为value 值没有任何好处。这是不必要的 html 标记膨胀。如果没有声明 value 属性,Javascript 仍将处理相同的数据。仅当 value 属性与选项的文本不同时才声明它。

标签: php loops foreach


【解决方案1】:
<?php foreach (range(1, 12) as $month): ?>
  <option value="<?= sprintf("%02d", $month) ?>"><?= sprintf("%02d", $month) ?></option>
<?php endforeach?>

您可能希望将 sprintf 的值保存到一个变量中以避免多次调用它。

【讨论】:

    【解决方案2】:

    使用str_pad():

    echo str_pad($month, 2, '0', STR_PAD_LEFT);
    

    或sprintf():

    echo sprintf('%02d', $month);
    

    【讨论】:

    • 我不知道str_pad...酷。
    • echo sprintf() 是一个“反模式”。绝对没有任何理由让任何人出于任何原因在任何代码中写入echo sprintf()——每次都应该是printf()。
    【解决方案3】:
    array_map( function( $day ) {
        return str_pad( $day, 2, '0', STR_PAD_LEFT );
    }, range(1, 31) );
    

    结果:

    Array
    (
        [0] => 01
        [1] => 02
        [2] => 03
        [3] => 04
        [4] => 05
        [5] => 06
        [6] => 07
        [7] => 08
        [8] => 09
        [9] => 10
        [10] => 11
        [11] => 12
        [12] => 13
        [13] => 14
        [14] => 15
        [15] => 16
        [16] => 17
        [17] => 18
        [18] => 19
        [19] => 20
        [20] => 21
        [21] => 22
        [22] => 23
        [23] => 24
        [24] => 25
        [25] => 26
        [26] => 27
        [27] => 28
        [28] => 29
        [29] => 30
        [30] => 31
    )
    

    适用于 PHP 5.3+。自己试试吧:https://3v4l.org/aE6HO

    【讨论】:

      【解决方案4】:
      $month = 1;
      echo sprintf("%02d", $month);
      out: 01
      

      使用 sprintf

      【讨论】:

      • 这个无法解释的答案正在展示“反模式”。绝对没有任何理由让任何人出于任何原因在任何代码中写入echo sprintf()——每次都应该是printf()。
      【解决方案5】:

      if($month &lt; 10) echo '0' . $month;

      或

      if($month &lt; 10) $month = '0' . $month;

      【讨论】:

        【解决方案6】:

        我知道这是一个较老的问题,但这里有一个可以很好地完成工作而无需明确使用 foreach() 的单行代码。

        $options = array_map( function( $hour ) {
            return str_pad( $hour, 2, '0', STR_PAD_LEFT );
        }, array_combine( range(1,12), range(1,12) ) );
        

        结果为:

        Array
        (
            [1] => 01
            [2] => 02
            [3] => 03
            [4] => 04
            [5] => 05
            [6] => 06
            [7] => 07
            [8] => 08
            [9] => 09
            [10] => 10
            [11] => 11
            [12] => 12
        )
        

        【讨论】:

        • 我认为调用array_reduce() 而不是array_map() 更有意义,这样您就可以管理关联键而无需调用array_combine() 并生成两个范围数组。
        【解决方案7】:

        我不喜欢在构建我的 html 标记时跳进跳出 php 标记。通过在printf() 中包含选项标签,您永远不需要离开 php。

        foreach (range(1, 12) as $month) {
            printf('<option>%02d</option>', $month);
        }
        

        此外,没有理由在选项标签中声明value 属性,因为它与选项的文本值相同。即使没有value 属性,javascript 仍然可以从文本中获取标签的value。

        仅在与选项文本不同时声明选项的value 属性。

        因此,如果您将value 属性保留为未填充的整数,如下所示:

        foreach (range(1, 12) as $month) {
            printf('<option value="%d">%02d</option>', $month, $month);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-27
          • 2021-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多