2012-05-25 39 views
4

我想弄清楚如何將數組中的一串字母值向下移動一步。例如,我的數組包含值(「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; 
} 

當我使用正值時,字母改變;然而,負數似乎根本沒有工作。

回答

15

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 - 我不知道你想怎麼處理接着就,隨即。

+0

感謝您的支持。這完美的作品! – user1418434

0
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); 
3

如果你需要減少類似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; 
}