我在PHP中有一个字符串。我想将某个字符与另一个字符的值交换。如果我按照自己的方式做,那么成为B的A将用B代替A,但已经存在的B值将保持不变。当我尝试将B交换为A时,当然会有一些最初未被交换的值,因为它们已经存在。
我尝试了这段代码。
$hex = "long_hex_string_not_included_here";
$hex = str_replace($a,$b,$hex);
//using this later will produced unwanted extra swaps
$hex = str_replace($b,$a,$hex);
我正在寻找交换这些值的函数。
答案 0 :(得分:8)
只需使用strtr
。这就是它的设计目的:
$string = "abcbca";
echo strtr($string, array('a' => 'b', 'b' => 'a'));
输出:
bacacb
这里有用的关键功能是当以两个参数形式调用strtr
时:
替换子字符串后,将不再搜索其新值。
这就是停止将a
替换为b
,然后再次替换为a
的原因。
答案 1 :(得分:2)
我们可以尝试用B
替换一些第三中间值,然后将所有A
替换为B
,然后将标记替换回{ {1}}。但这总是使标记字符可能已经出现在字符串中的某处成为可能。
一种更安全的方法是将输入字符串隐藏为一个字符数组,然后仅检查每个索引中的A
或A
,然后沿着该数组走,然后进行相应的交换。
B
还要注意,这种方法非常有效,只需要向下遍历输入字符串一次即可。
答案 2 :(得分:1)
使用Temp值(在字符串中不会出现。可以是任何值):
$temp = "_";
$a = "a";
$b = "b";
$hex = "abcdabcd";
$hex = str_replace($a, $temp, $hex); // "_bcd_bcd"
$hex = str_replace($b, $a, $hex); // "_acd_acd"
$hex = str_replace($temp, $a, $hex); // "bacdbacd"
// Or, alternativly a bit shorter:
$temp = "_";
$a = "a";
$b = "b";
$hex = str_replace([$a, $b, $temp], [$temp, $a, $b] $hex);
答案 3 :(得分:0)
另一种方法可以是str_split字符串,并对每个字符使用array_map测试。如果为a
,则返回b
,反之亦然。否则返回原始值。
$hex = "abba test baab";
$hex = array_map(function ($x) {
return ($x === 'a') ? 'b' : (($x === 'b') ? 'a' : $x);
}, str_split($hex));
echo implode('', $hex);
结果
baab test abba
答案 4 :(得分:0)
我的解决方案适用于子字符串。代码不清楚,但我想向您展示一种思维方式。
$html = "dasdfdasdff";
$firstLetter = "d";
$secondLetter = "a";
$firstLetterPositions = array();
$secondLetterPositions = array();
$lastPos = 0;
while (($lastPos = strpos($html, $firstLetter, $lastPos))!== false) {
$firstLetterPositions[] = $lastPos;
$lastPos = $lastPos + strlen($firstLetter);
}
$lastPos = 0;
while (($lastPos = strpos($html, $secondLetter, $lastPos))!== false) {
$secondLetterPositions[] = $lastPos;
$lastPos = $lastPos + strlen($secondLetter);
}
for ($i = 0; $i < count($firstLetterPositions); $i++) {
$html = substr_replace($html, $secondLetter, $firstLetterPositions[$i], count($firstLetterPositions[$i]));
}
for ($i = 0; $i < count($secondLetterPositions); $i++) {
$html = substr_replace($html, $firstLetter, $secondLetterPositions[$i], count($secondLetterPositions[$i]));
}
var_dump($html);