使用PHP重新排列每个x字母位置的字符串

时间:2010-10-19 14:47:13

标签: php encryption loops

我正在试图找出如何使用每个x位置重新排列字符串,以便输出字符串“ABCDEFGHI”和x为4将产生DHCIFEGBA。这是我如何得到的:

第一个字母很简单:字符为4. [A,B,C, D ]
第二个字母也很简单:字符为8. [E,F,G, H ]
第三个字母很容易:它是第3个字符3.这是因为我在计算时循环,因此我使用了I,A,B, C
第四个字母是事情变得棘手的地方:它是字符9.因为D和H已经消失,它们不会被计算使用,导致E,F,G,。 /> 字母#5遵循相同的模式,跳过C和D:A,B,E, F
字母#6有跳过和换行:G,A,B, E
字母#7再次包裹:G,A,B, G
字母#8也包装(技术上两次,因为'光标'在G之后:A,B,A, B
字母#9是我们的余数:A,A,A, A


它显然需要循环,直到输出字符串长度与输入字符串长度匹配 - 这是所有这些混乱在中间(主要是跳过和循环),我不能为我的生活弄清楚。

感谢任何帮助或指导。

3 个答案:

答案 0 :(得分:2)

与独特的范围完美配合,但会失败,如ABCDEAFGHAI

$s = 'ABCDEFGHI';
$_len = strlen($s);
$out = '';
$c = 3;
echo '<pre>';
while ( $_len > 0 ) {
    echo strlen($s) ,  ' :: '.  $s . "\n";
    $term = $s[$c-1];
    list($a,$b) = explode($term, $s);
    $s = $b.$a;
    $x = strlen($s);
    if($x <= $c) {
        for($i=0; $i<($c-$x);$i++)
            $s .= $s;
    }

    $out .= $term;
    $_len--;
}

echo "\n\n\n" , $out;

输出:

9 :: ABCDEFGHI
8 :: EFGHIABC
7 :: IABCEFG
6 :: EFGIAB
5 :: ABEFG
4 :: GABE
6 :: GABGAB
4 :: ABAB
4 :: AAAA

DHCIFEGBA

希望更好的解决方案

function rearrangeString($string, $step = 4) {
    $output = '';
    $lenght = strlen($string);

    if($step >= $lenght) {
        return strrev($string);
    } elseif($step < 1) {
        return $string;
    } else {
        for($i=0; $i < $lenght; $i++) {
            $_tempLen = strlen($string);

            $output .= $string[$step-1];

            list($a,$b) = explode($string[$step-1], $string);

            $string = $b . $a;

            $_tempLen = strlen($string);
            if($step > $_tempLen) {
                $string = str_repeat($string, $step-$_tempLen+1);
            }
            unset($_tempLen, $a, $b);
        }

        return $output;
    }
}

$rearranged = rearrangeString('ABCDEFGHI');
var_dump($rearranged == 'DHCIFEGBA');

$rearranged = rearrangeString('ABCDEFGHI', 9);
var_dump($rearranged == 'IHGFEDCBA');

$rearranged = rearrangeString('ABCDEFGHI', 1);
var_dump($rearranged == 'ABCDEFGHI');

$rearranged = rearrangeString('ABCDEFGHI', 3);
var_dump($rearranged == 'CFIDHEBGA');

$rearranged = rearrangeString('ABCDEFGHI', 6);
var_dump($rearranged == 'FCAIBEHD');

$rearranged = rearrangeString('FARBE', 2);
var_dump($rearranged == 'ABFER');

答案 1 :(得分:0)

我会尝试这样,虽然我还没有测试过代码,但是:

$s = 'ABCDEFGHI';
$out = '';

While strlen($s) > 0 {
    $pos = 4 % strlen($s);
    $out += $s[$pos];
    if (strlen($s) > 3) $end = 3;
    else $end = strlen($s) - 1;
    $s = substr($s, 4, strlen($s)) + substr($s, 0, $end);
}

echo $out;

答案 2 :(得分:0)

适用于任何$s$n

  <?php
    $s = "ABCDEFGHI";
    $n = 4;

    for ($i=0,$l=strlen($s) ; $l ; $l--)
    {
       $i = ($i+$n-1) % $l;
       echo $s[$i];
       $s = ($i ? substr($s, 0, $i) : '') . ($i < $l-1 ? substr($s, $i+1) : '');
    }
    echo "\n";
  ?>