Мне сложно понять, когда strtr
предпочтительнее str_replace
или наоборот. Кажется, что можно достичь тех же результатов, используя любую функцию, хотя порядок замены подстрок отменяется. Например:
echo strtr('test string', 'st', 'XY')."\n"; echo strtr('test string', array( 's' => 'X', 't' => 'Y', 'st' => 'Z' ))."\n"; echo str_replace(array('s', 't', 'st'), array('X', 'Y', 'Z'), 'test string')."\n"; echo str_replace(array('st', 't', 's'), array('Z', 'Y', 'X'), 'test string');
Эти результаты
YeXY XYring YeZ Zring YeXY XYring YeZ Zring
Помимо синтаксиса, есть ли какая-либо польза от использования одного над другим? Любые случаи, когда одного не хватит для достижения желаемого результата?
Первая разница:
Интересный пример другого поведения между strtr
и str_replace
содержится в разделе комментариев руководства PHP:
<?php $arrFrom = array("1","2","3","B"); $arrTo = array("A","B","C","D"); $word = "ZBB2"; echo str_replace($arrFrom, $arrTo, $word); ?>
Чтобы выполнить эту работу, вместо этого используйте «strtr»:
<?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?>
Это означает, что str_replace
является более глобальным подходом к замене, в то время как strtr
просто переводит символы один за другим.
Другое отличие:
Учитывая следующий код (взятый из сравнения скорости замены строк PHP ):
<?php $text = "PHP: Hypertext Preprocessor"; $text_strtr = strtr($text , array("PHP" => "PHP: Hypertext Preprocessor" , "PHP: Hypertext Preprocessor" => "PHP")); $text_str_replace = str_replace(array("PHP", "PHP: Hypertext Preprocessor") , array("PHP: Hypertext Preprocessor", "PHP") , $text); var_dump($text_strtr); var_dump($text_str_replace); ?>
Полученные строки текста будут следующими:
string (3) "PHP"
string (27) "PHP: Hypertext Preprocessor"
Основное объяснение:
Это происходит потому, что:
strtr : сортирует свои параметры по длине в порядке убывания, поэтому:
str_replace : он работает в порядке определения ключей, поэтому:
«PHP: препроцессор гипертекста: препроцессор гипертекста».
затем он находит следующий ключ: «PHP: Hypertext Preprocessor» в результирующем тексте предыдущего шага, поэтому его заменяет «PHP», что дает результат:
«PHP: препроцессор гипертекста».
больше нет ключей для поиска, поэтому замена заканчивается там.
Кажется, что можно достичь точно таких же результатов, используя любую функцию
Это не всегда верно и зависит от поиска и замены данных, которые вы предоставляете. Например, если две функции различаются, см.: Имеет ли PHP str_replace ограничение более 13 символов?
strtr
не заменит в частях строки, которые уже были заменены – str_replace
заменит внутренние замены. strtr
начнет с самого длинного ключа первым, если вы str_replace
его с двумя параметрами – str_replace
заменит слева направо. str_replace
может вернуть количество выполненных замен – strtr
не предлагает такого значения count. Я думаю, что strtr
обеспечивает более гибкую и условную замену при использовании с двумя аргументами, например: если строка равна 1, замените на a, но если строка равна 10, замените на b. Этот трюк может быть достигнут только strtr
.
$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // ab000a
см .: Php Manual Strtr .
Обратите внимание, что в руководстве STRTR– Описание string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Если заданы три аргумента, эта функция возвращает копию str, где …
STR_REPLACE– … Если поиск или замена являются массивами, их элементы обрабатываются в первую очередь . …
STRTR каждый поворот НЕ воздействует на следующий, НО STR_REPLACE делает.