Мне сложно понять, когда 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
Помимо синтаксиса, есть ли преимущества в использовании одного над другим? Есть ли случаи, когда одного было бы недостаточно для достижения желаемого результата?
php
string
str-replace
strtr
Эндрютвебер
источник
источник
strtr
может быть легко неправильно истолковано,strstr
что совсем другое. Я начинаю думать, что я дислексик. Не допустите такой ошибки с str_replace.Ответы:
Первое отличие:
Интересный пример различного поведения между
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); ?>
В результате появятся следующие строки текста:
Основное объяснение:
Это происходит потому, что:
strtr : он сортирует свои параметры по длине в порядке убывания, поэтому:
str_replace : он работает в том порядке, в котором определены ключи, поэтому:
затем он находит следующий ключ: «PHP: препроцессор гипертекста» в результирующем тексте предыдущего шага, поэтому он заменяется на «PHP», что дает в результате:
ключей больше нет, поэтому замена на этом заканчивается.
источник
strtr
не заменяет текст, вставленный предыдущими заменами.strtr('foo', array('oo' => 'ie', 'e' => 't'))
возвращает'fie'
вместо ,'fit'
какstr_replace
делает. Таким образом, он автоматически решает проблему, поднятую @Pies.Это не всегда так и зависит от данных поиска и замены, которые вы предоставляете. Например, где эти две функции различаются, см .: Имеет ли PHP str_replace ограничение более 13 символов?
strtr
не будет заменять в частях строки, которые уже были заменены -str_replace
заменит внутри заменяет.strtr
сначала будет начинаться с самого длинного ключа, если вы вызываете его с двумя параметрами -str_replace
будет заменять слева направо.str_replace
может возвращать количество выполненных замен -strtr
не предлагает такое значение счетчика.источник
Я думаю,
strtr
обеспечивает более гибкую и условную замену при использовании с двумя аргументами, например: если строка равна 1, заменить на a, а если строка равна 10, заменить на b. Этого трюка можно было достичь только с помощьюstrtr
.$string = "1.10.0001"; echo strtr($string, array("1" => "a", "10" => "b")); // a.b.000a
см .: Руководство по Php Strtr .
источник
Примечание в руководстве STRTR - Описание string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) Если задано три аргумента, эта функция возвращает копию str, где ...
STR_REPLACE-- ... Если поиск или замена являются массивами, их элементы обрабатываются с начала до конца . ...
STRTR каждый ход НЕ влияет на следующий, НО STR_REPLACE действует.
источник