Когда использовать 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


помимо синтаксиса, есть ли преимущество использования одного над другим? Есть случаи, когда одного будет недостаточно для достижения желаемого результата?

688   4  

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: сортировка параметров по длине в порядке убывания так:

    1. это придаст" большую важность " самому большому, а затем, поскольку текст темы сам по себе является самым большим ключом массива замены, он переводится.
    2. потому что все символы текста темы есть был заменен, процесс заканчивается там.
  • как str_replace: он работает в том порядке, ключи определены, так что:

    1. он находит ключ "PHP" в тексте темы и заменяет его: "PHP: препроцессор гипертекста", что дает в результате:

      "PHP: препроцессор гипертекста: препроцессор гипертекста".

    2. затем он находит следующий ключ: "PHP: препроцессор гипертекста" в полученный текст первого шага, поэтому он заменяется на "PHP", что дает в результате:

      "PHP: препроцессор гипертекста".

    3. там нет больше ключей, чтобы искать, так что замена заканчивается там.

кажется, что можно достичь тех же результатов, используя функцию

это не всегда верно и зависит от поиска и замены данных, которые вы предоставляете. Например, где две функции отличаются см.:имеет ли 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

    Ничего не найдено.