6

配列内の文字値の束を1ステップ下にシフトする方法を理解しようとしています。たとえば、私の配列には値( "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;
}

正の値を使用すると、文字が変わります。ただし、負の数はまったく機能していないようです。

4

3 に答える 3

16

PHP は++文字列をオーバーロードしています。の場合はそうではありません--chrord、およびを使用すると、よりクリーンなコードで同じことができます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- それをどのように処理したいかわかりません。

于 2012-05-26T00:13:06.890 に答える
7

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;
}
于 2015-04-07T10:08:07.763 に答える
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);
于 2012-05-26T00:21:12.717 に答える