比如这段代码
<?php
 $c="0123456789";
 $a=array("/0/","/1/","/2/","/3/","/4/","/5/","/6/","/7/","/8/","/9/");
 $b=array("4","6","8","3","5","7","1","9","0","2");
 $c = preg_replace($a,$b,$c);
 echo $c;
?>:我想要的是两个数组里一对一的替换,即结果是4683571902,而这段代码输出的是2103221202,貌似是多次重复替换了,将$b里面的换成英文字母就可以做到一一对应下面这段代码的写法输出结果无法一一对应,应该如何修改?希望大家能帮帮忙,不胜感激!$keyword=array(
         "1" => "6",
         "2" => "8",
         "3" => "3",
         "4" => "5",
         "5" => "7",
         "6" => "1",
         "7" => "9",
         "8" => "0",
         "9" => "2",
         "0" => "4"
);function replace_keyword($string,$t=1){
    global $keyword;
    $keyword_key = array_keys($keyword);
    $keyword_value = array_values($keyword);
    if($t==1){
    $string = str_replace($keyword_key,$keyword_value,$string);
    }elseif($t==2){
    $string = str_replace($keyword_value,$keyword_key,$string);    
    }
    return $string;
}

解决方案 »

  1.   

    一对一替换用str_replace比如
    $str = "123123";
    $a = array(1, 2, 3);
    $b = array('A', 'B', 'C');echo str_replace($a, $b, $str);
      

  2.   


    $keyword=array(
             "1" => "6",
             "2" => "8",
             "3" => "3",
             "4" => "5",
             "5" => "7",
             "6" => "1",
             "7" => "9",
             "8" => "0",
             "9" => "2",
             "0" => "4"
    );
    $string = "12313";
    function wordReplace($matches) {
    return $GLOBALS['keyword'][$matches[0][0]];
    }
    echo preg_replace_callback("|(\d)|", "wordReplace", $string);
    //要不加个回调函数吧
      

  3.   

    不要在一个语句用同一个变量就没有问题了,修改如下:
    $result = str_replace($keyword_value,$keyword_key,$string);
    $string = $result;
      

  4.   

    return $GLOBALS['keyword'][$matches[1]];看球了,没心情,老出错,,,虽然上面的在当前情况下返回是正确的
      

  5.   

    你这种情况仅仅preg_replace是不行的。
    它会按替换和被替换的数组的元素顺序替换。一个笨办法,自己写个函数,遍历的方式,替换一个后,通过strpos记录下该次被替换的所有元素的字符位置,并记录在一个数组中。每次替换即验证当次要替换元素的位置是否包含或交叉于记录的这个数组中,存在则不替换该位置的元素,不存在则替换。
      

  6.   

    $c="0123456789";
    $b=array("4","6","8","3","5","7","1","9","0","2");
    echo strtr($c, $b); //4683571902
      

  7.   


    谢谢!
    这个单独运行OK,不过用在主贴里面的第二段代码,也不行,我是直接将str_replace换成strtr的,不知对不对?
      

  8.   

    $keyword=array(
             "1" => "6",
             "2" => "8",
             "3" => "3",
             "4" => "5",
             "5" => "7",
             "6" => "1",
             "7" => "9",
             "8" => "0",
             "9" => "2",
             "0" => "4"
    );function replace_keyword($string,$t=1){
        global $keyword;
        $keyword_key = array_keys($keyword);
        $keyword_value = array_values($keyword);
        if($t==1){
        $string = strtr($keyword_key, $string);
        }elseif($t==2){
        $string = strtr(array_flip($keyword),$string);    
        }
        return $string;
    }
      

  9.   

    谢谢xuzuning,按照上面的代码我试了还是不行,提示strtr() The second argument is not an array下面这样的用字母就完全正常,对应的关系也不会错
    $keyword=array(
     "1" => "m",
                     "2" => "b",
                     "3" => "m",
     "4" => "d",
     "5" => "e",
     "6" => "j",
     "7" => "g",
     "8" => "h",
     "9" => "i",
     "0" => "k"
    );function replace_keyword($string,$t=1){
        global $keyword;
        $keyword_key = array_keys($keyword);
        $keyword_value = array_values($keyword);
        if($t==1){
        $string = str_replace($keyword_key,$keyword_value,$string);
        }elseif($t==2){
        $string = str_replace($keyword_value,$keyword_key,$string);    
        }
        return $string;
    }不知道应该怎么改呢?麻烦xuzuning再帮帮忙,非常感谢!
      

  10.   

    晕,刚贴的代码写错了,重贴一次$keyword=array(
             "1" => "m",
                     "2" => "b",
                     "3" => "n",
             "4" => "d",
             "5" => "e",
             "6" => "j",
             "7" => "g",
             "8" => "h",
             "9" => "i",
             "0" => "k"
    );function replace_keyword($string,$t=1){
        global $keyword;
        $keyword_key = array_keys($keyword);
        $keyword_value = array_values($keyword);
        if($t==1){
        $string = str_replace($keyword_key,$keyword_value,$string);
        }elseif($t==2){
        $string = str_replace($keyword_value,$keyword_key,$string);    
        }
        return $string;
    }这个用字母代替数字是无错的
      

  11.   

    $keyword=array(
      "1" => "6",
      "2" => "8",
      "3" => "3",
      "4" => "5",
      "5" => "7",
      "6" => "1",
      "7" => "9",
      "8" => "0",
      "9" => "2",
      "0" => "4"
    );function replace_keyword($string,$t=1){
      global $keyword;
      if($t==1){
        $string = strtr($string, $keyword);
      }elseif($t==2){
        $string = strtr($string, array_flip($keyword));   
      }
      return $string;
    }
    echo replace_keyword("0123456789");//4683571902
      

  12.   

    已经解决了,非常感谢xuzuning!