Когда использовать strtr vs STR replace?
мне трудно понять, когда 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
помимо синтаксиса, есть ли преимущество использования одного над другим? Есть случаи, когда одного будет недостаточно для достижения желаемого результата?
4 ответов:
первое различие:
интересный пример другого поведения между
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); ?>
- я ожидал бы в результате: "ZDDB"
- однако, это возвращение: "ZDDD" (Потому что B = D Согласно нашему массиву)
чтобы сделать эту работу, используйте "strtr" вместо:
<?php $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); $word = "ZBB2"; echo strtr($word,$arr); ?>
- это возвращает: "ZDDB"
это означает, что
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); ?>результирующие строки текста будут:
строка(3)"PHP"
строка (27) " PHP: гипертекст Препроцессор"
главное объяснение:
это происходит потому, что:
strtr: сортировка параметров по длине в порядке убывания так:
- это придаст" большую важность " самому большому, а затем, поскольку текст темы сам по себе является самым большим ключом массива замены, он переводится.
- потому что все символы текста темы есть был заменен, процесс заканчивается там.
как str_replace: он работает в том порядке, ключи определены, так что:
- он находит ключ "PHP" в тексте темы и заменяет его: "PHP: препроцессор гипертекста", что дает в результате:
"PHP: препроцессор гипертекста: препроцессор гипертекста".
затем он находит следующий ключ: "PHP: препроцессор гипертекста" в полученный текст первого шага, поэтому он заменяется на "PHP", что дает в результате:
"PHP: препроцессор гипертекста".
там нет больше ключей, чтобы искать, так что замена заканчивается там.
кажется, что можно достичь тех же результатов, используя функцию
это не всегда верно и зависит от поиска и замены данных, которые вы предоставляете. Например, где две функции отличаются см.:имеет ли 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-- Описание: строковые функции strtr ( строки STR$, строки из строки в ) string strtr ( string $str, array $replace_pairs ) Если задано три аргумента, эта функция возвращает a скопировать ул. где ...
Как str_replace-- ... Если поиск или замена являются массивами, их элементы обрабатываются от первого до последнего. ...
STRTR каждый поворот не влияет на следующий, но STR_REPLACE делает.
Comments