在PHP中将字符串旋转N次

5

我正在寻找一种方法将字符串向左旋转 N 次。以下是一些示例:

假设字符串是 abcdef

  • 如果我旋转它 1 次,我希望得到 bcdefa
  • 如果我旋转它 2 次,我希望得到 cdefab
  • 如果我旋转它 3 次,我希望得到 defabc
  • ...
  • ...
  • 如果我将字符串旋转其长度次数,应该会返回原始字符串。
7个回答

19
 $rotated = substr($str, $n) . substr($str, 0, $n);

3
如果$n大于字符串长度,那么这样做是行不通的,对吧? - Svish
1
如果 $n > 字符串长度,则会返回原始字符串。 - Gordon
@Gordon,Svish:我的N永远不会超过字符串长度。 - gameover
如果$n > strlen($str)$,你可以通过$n % strlen($str)$ 来解决问题,然后采用stereofrog提供的解决方案。 - Adi
@Gordon 是的,我没有注意到,抱歉。不管怎样,那是正确的做法 :)。 - Adi
显示剩余2条评论

4

这里有一种变体,允许任意向左和向右移位,而不受输入字符串长度的限制:

function str_shift($str, $len) {
    $len = $len % strlen($str);
    return substr($str, $len) . substr($str, 0, $len);
}

echo str_shift('abcdef', -2);  // efabcd
echo str_shift('abcdef', 2);   // cdefab
echo str_shift('abcdef', 11);  // fabcde

2
function rotate_string ($str, $n)
{
    while ($n > 0)
    {
        $str = substr($str, 1) . substr($str, 0, 1);
        $n--;
    }

    return $str;
}

1

虽然没有标准函数,但很容易实现。

function rotate_left($s) {
  return substr($s, 1) . $s[0];
}

function rotate_right($s) {
  return substr($s, -1) . substr($s, 0, -1);
}

你可以扩展这个函数,添加一个可选参数来指定旋转的字符数。


1
function rotate_string($str) {
    for ($i=1; $i<strlen($str)+1;$i++) {
        @$string .= substr($str , strlen($str)-$i , 1);
    }
    return $string;
}

echo rotate_string("string"); //gnirts

0
使用这段代码。
<?php
    $str = "helloworld" ;
    $res = string_function($str,3) ;
    print_r ( $res) ;
    function string_function ( $str , $count )
    {
    $arr = str_split ( $str );
    for ( $i=0; $i<$count ; $i++ )
    {
      $element = array_pop ( $arr ) ;
      array_unshift ( $arr, $element ) ;
    }
    $result=( implode ( "",$arr )) ;
    return $result;
    }
    ?>

0

你也可以像这样获取N个旋转字符串。

$str = "Vijaysinh";
$arr1 = str_split($str);
$rotated = array();
$i=0;


    foreach($arr1 as $a){
        $t = $arr1[$i];
        unset($arr1[$i]);
        $rotated[] = $t.implode($arr1);
        $arr1[$i] = $t;
        $i++; 
    }
    echo "<pre>";print_r($rotated);exit;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接