Как я могу поменять местами значения двух разных символов в строке с PHP? А становится В, В становится А - PullRequest
0 голосов
/ 07 января 2019

У меня есть строка в PHP. Я хочу поменять определенный символ со значением другого символа. Если я сделаю это по-своему, A, став B, заменит A на B, но уже существующие значения 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);

Я ищу функцию для замены этих значений.

Ответы [ 5 ]

0 голосов
/ 07 января 2019

Мое решение работает для подстрок. Код не понятен, но я хочу показать вам образ мышления.

$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);
0 голосов
/ 07 января 2019

Другим способом может быть 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

Демо

0 голосов
/ 07 января 2019

Мы можем просто попытаться заменить третье промежуточное значение на B, затем заменить все A на B, а затем заменить маркер обратно на A. Но это всегда оставляет открытой возможность того, что маркерный символ уже может появиться где-то в строке.

Более безопасный подход - преобразовать входную строку в массив символов, а затем пройтись по массиву, просто проверяя каждый индекс на A или B и меняя местами соответственно.

$input = "AzzzzB";
echo $input ."\n";
$arr = str_split($input);

for ($i=0; $i < count($arr); $i++) {
    if ($arr[$i] == 'A') {
        $arr[$i] = 'B';
    }
    else if ($arr[$i] == 'B') {
        $arr[$i] = 'A';
    }
}
$output = implode('', $arr);
echo $ouput;

AzzzzB
BzzzzA

Также обратите внимание, что этот подход эффективен и требует только один раз пройти по входной строке.

0 голосов
/ 07 января 2019

Просто используйте strtr. Вот для чего он был разработан:

$string = "abcbca";
echo strtr($string, array('a' => 'b', 'b' => 'a'));

Выход:

bacacb

Ключевая функциональность, которая помогает здесь, заключается в том, что когда strtr вызывается в форме с двумя аргументами:

После замены подстроки ее новое значение больше не будет искать.

Это то, что останавливает a, который был заменен на b, а затем снова заменяется на a.

Демонстрация на 3v4l.org

0 голосов
/ 07 января 2019

Используйте значение 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...