【问题标题】:Decrementing alphabetical values递减字母值
【发布时间】:2012-05-25 23:59:25
【问题描述】:

我试图弄清楚如何将数组中的一堆字母值向下移动一步。例如,我的数组包含值(“d”,“e”,“f”,“g”,“h”),我想将其更改为(“c”,“d”,“e”,“f “, “G”)。这是我正在使用的代码:

function move_up_left($x) {
    if($x['orientation'] == "down") {
        foreach($x[0] as &$value) {
            $value = --$value; 
        }
    } else {
        foreach($x[1] as &$value) {
            $value = --$value;
        }
    }

    return $x;
}

当我使用正值时,字母会发生变化;但是负数似乎根本不起作用。

【问题讨论】:

    标签: php


    【解决方案1】:

    PHP 为字符串重载了++-- 不是这种情况。你可以用更简洁的代码来做同样的事情chrordarray_map

    function decrementLetter($l) {
        return chr(ord($l) - 1);
    }
    
    function move_up_left($x) {
        if($x['orientation'] === 'down') $arr = &$x[0];
        else $arr = &$x[1];
    
        $arr = array_map('decrementLetter', $arr);
    
        return $x;
    }
    

    Here's a demo. 请注意,您可能需要添加一个特殊情况来减少 a - 我不确定您要如何处理。

    【讨论】:

      【解决方案2】:

      如果您需要减少类似 Excel 的变量('A'、'AA'、...),这就是我来的函数。它不适用于特殊字符,但不区分大小写。如果您尝试减少 'a' 或 'A',它会返回 null。

      function decrementLetter($char) {
           $len = strlen($char);
           // last character is A or a
           if(ord($char[$len - 1]) === 65 || ord($char[$len - 1]) === 97){ 
                if($len === 1){ // one character left
                     return null;
                 }
                 else{ // 'ABA'--;  => 'AAZ'; recursive call
                     $char = decrementLetter(substr($char, 0, -1)).'Z';
                  }
           }
           else{
               $char[$len - 1] = chr(ord($char[$len - 1]) - 1);
           }
           return $char;
      }
      

      【讨论】:

        【解决方案3】:
        function shift_character($array, $right = FALSE)
        {
            $inc = ($right) ? 1 : -1;
            for ($i = 0; $i < count($array); $i++)
            {
                $array[$i] = chr(ord($array[$i]) + $inc);
            }
            return $array;
        }
        
        $example = array('b', 'c');
        $shift_left = shift_character($example);
        $shift_right = shift_character($example, TRUE);
        
        print_r($example);
        print_r($shift_left);
        print_r($shift_right);
        

        【讨论】:

          猜你喜欢
          • 2017-04-10
          • 2017-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-09
          • 2010-10-29
          • 1970-01-01
          • 2011-09-08
          相关资源
          最近更新 更多