Уменьшение алфавитных значений

Я пытаюсь понять, как сдвинуть кучу буквенных значений в массиве на один шаг. Например, мой массив содержит значения («d», «e», «f», «g», «h»), и я хочу изменить это на («c», «d», «e», «f ", "г"). Вот код, с которым я работаю:

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; } 

Когда я использую положительные значения, буквы меняются; однако отрицательные числа, похоже, вообще не работают.

Solutions Collecting From Web of "Уменьшение алфавитных значений"

PHP перегружает ++ для строк; это не относится к -- . Вы можете сделать то же самое с гораздо более чистым кодом с помощью chr , ord и array_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; } 

Вот демо. Обратите внимание, что вам может потребоваться добавить специальный случай для уменьшения a – я не уверен, как вы хотите с этим справиться.

Если вам нужно уменьшить Excel-подобные переменные («A», «AA», …), вот функция, к которой я пришел. Он не работает со специальными символами, но нечувствителен к регистру. Он возвращает null, если вы пытаетесь уменьшить «a» или «A».

 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; } 
 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);