I'm trying to figure out how to shift a bunch of letter values in an array down one step. For example, my array contains values ("d", "e", "f", "g", "h") and I want to change this to ("c", "d", "e", "f", "g"). Here's the code I'm working with:
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;
}
When I use positive values, the letters change; however the negative numbers do not seem to be working at all.
PHP has overloaded ++
for strings; this isn't the case for --
. You can do the same thing with much cleaner code with chr
, ord
, and 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;
}
Here's a demo. Note that you may need to add a special case for decrementing a
- I'm not sure how you want to deal with that.
If you need to decrement Excel-like variables ('A', 'AA', ...), here's the function I came to. It doesn't work with special characters but is case insensitive. It returns null if you try to decrement 'a' or '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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With