Php 交换字符串中的每一对字符

Php 交换字符串中的每一对字符,php,string,Php,String,我想得到字符串中交换字符对的所有排列。例如: 基本字符串:abcd 组合: bacd acbd abdc 等等 编辑 我只想交换彼此相邻的字母。就像第一和第二,第二和第三,但不是第三和第六 最好的方法是什么 编辑 只是为了好玩:有三个或四个解决方案,有人可以发布这些解决方案的速度测试,以便我们可以比较哪一个最快 速度测试 我对nickf的代码和我的代码进行了速度测试,结果是我的代码比nickf的代码快4个字母(10公里的时间是0.08和0.06),但是nickf的代码比nickf的代码快10个字

我想得到字符串中交换字符对的所有排列。例如:

基本字符串:
abcd

组合:

  • bacd
  • acbd
  • abdc
  • 等等

    编辑 我只想交换彼此相邻的字母。就像第一和第二,第二和第三,但不是第三和第六

    最好的方法是什么

    编辑 只是为了好玩:有三个或四个解决方案,有人可以发布这些解决方案的速度测试,以便我们可以比较哪一个最快

    速度测试
    我对nickf的代码和我的代码进行了速度测试,结果是我的代码比nickf的代码快4个字母(10公里的时间是0.08和0.06),但是nickf的代码比nickf的代码快10个字母(nick的0.24和我的0.37)

    编辑:Markdown今天恨我

    $input = "abcd";
    $len = strlen($input);
    $output = array();
    
    for ($i = 0; $i < $len - 1; ++$i) {
        $output[] = substr($input, 0, $i)
                  . substr($input, $i + 1, 1)
                  . substr($input, $i, 1)
                  . substr($input, $i + 2);
    }
    print_r($output);
    
    $input=“abcd”;
    $len=strlen($input);
    $output=array();
    对于($i=0;$i<$len-1;++$i){
    $output[]=substr($input,0,$i)
    .substr($input,$i+1,1)
    .substr($input,$i,1)
    .substr($input,$i+2);
    }
    打印(输出);
    
    nickf制造的漂亮解决方案谢谢,我想出了不那么漂亮的:

      $arr=array(0=>'a',1=>'b',2=>'c',3=>'d');
      for($i=0;$i<count($arr)-1;$i++){
      $swapped="";
      //Make normal before swapped
      for($z=0;$z<$i;$z++){
       $swapped.=$arr[$z];
      }
      //Create swapped
      $i1=$i+1;
      $swapped.=$arr[$i1].$arr[$i];
    
      //Make normal after swapped.     
      for($y=$z+2;$y<count($arr);$y++){
      $swapped.=$arr[$y];
    
      }
    $arrayswapped[$i]=$swapped;
    }
    var_dump($arrayswapped);
    
    $arr=array(0=>'a',1=>'b',2=>'c',3=>'d');
    
    对于($i=0;$i而言,谷歌的快速搜索给了我:


    仅使用以下各项如何:

    function swap($s, $i)
    {
      $t = $s[$i];
      $s[$i] = $s[$i+1];
      $s[$i+1] = $t;
    
      return $s;
    }
    
    $s = "abcd";
    $l = strlen($s);
    for ($i=0; $i<$l-1; ++$i)
    {
      print swap($s,$i)."\n";
    }
    
    函数交换($s,$i)
    {
    $t=$s[$i];
    $s[$i]=$s[$i+1];
    $s[$i+1]=$t;
    返回$s;
    }
    $s=“abcd”;
    $l=strlen($s);
    
    对于($i=0;$i,这里有一个稍微快一点的解决方案,因为它没有过度使用substr()


    但这并不能给出所有可能的版本,不是吗?除非我误解了OP的问题。HoboBen命令只交换彼此相邻的字母。就像第一个字母与第二个字母,第二个字母与第三个字母,但不是第三个字母与第六个字母。为什么要让该函数通过引用更改字符串,只是为了再次更改它?为什么不只是进行更改并返回新字符串?我试图保持聪明,避免创建字符串。然而,这有点过早优化,在大多数情况下可能是无用的。此外,我几乎不了解PHP(或其内存模型),因此我实际上不知道它是否是一个优化。我现在更改了它;感谢您的评论。相关概念:。您可能希望删除“etc”,并强调您对字符串的所有排列不感兴趣。
    function swapcharpairs($input = "abcd") {
      $pre = "";
      $a="";
      $b = $input[0];
      $post = substr($input, 1);
      while($post!='') {
        $pre.=$a;
        $a=$b;
        $b=$post[0];
        $post=substr($post,1);
        $swaps[] = $pre.$b.$a.$post;
      };
      return $swaps;
    }
    
    print_R(swapcharpairs());