strtr과 str_replace를 언제 사용합니까?


86

나는 언제 strtrstr_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

구문 외에도 다른 하나를 사용하면 이점이 있습니까? 원하는 결과를 얻기에 충분하지 않은 경우가 있습니까?


3
가독성의 관점에서 보면 상당히 다르기 strtr때문에 쉽게 잘못 읽을 수 있습니다 strstr. 내가 난독증이라고 생각하기 시작했습니다. str_replace로 그 실수를하지 않을 것입니다.
Programster

답변:


135

첫 번째 차이점 :

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 String Replacement Speed ​​Comparison에서 가져옴 )가 주어집니다 .

<?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 : 하이퍼 텍스트 전 처리기"


주요 설명 :

이것은 다음과 같은 이유로 발생합니다.

  • strtr : 매개 변수를 길이별로 내림차순으로 정렬합니다.

    1. 가장 큰 것에 "더 많은 중요성"을 부여하고 제목 텍스트 자체가 대체 배열의 가장 큰 키이므로 번역됩니다.
    2. 제목 텍스트의 모든 문자가 교체 되었기 때문에 프로세스가 여기서 끝납니다.
  • str_replace : 키가 정의 된 순서대로 작동합니다.

    1. 제목 텍스트에서 "PHP"키를 찾아 "PHP : Hypertext Preprocessor"로 바꿉니다. 결과는 다음과 같습니다.

      “PHP : 하이퍼 텍스트 전 처리기 : 하이퍼 텍스트 전 처리기”.

    2. 그런 다음 이전 단계의 결과 텍스트에서 다음 키인 "PHP : Hypertext Preprocessor"를 찾으므로 "PHP"로 대체되며 결과는 다음과 같습니다.

      “PHP : 하이퍼 텍스트 전 처리기”.

    3. 더 이상 찾을 키가 없으므로 교체가 끝납니다.


2
아, 고마워요! 나는 strtr이 길이로 번역한다는 것을 깨닫지 못했습니다. 역순이라고 생각했습니다.
andrewtweber

php.net에 설명 된대로 str_replace 함수에는 교체가 수행되어야하는 시간을 나타내는 "count"라는 매개 변수가 1 개 더 있습니다. 하지만 어쨌든이 매개 변수를 사용할 수 없습니다. 이유를 아는 사람이 있습니까?
vantrung -cuncon

1
@ vantrung-cuncon 그것은 그 매개 변수의 목적이 아닙니다. 문서는 "이것은 수행 된 교체 횟수로 설정됩니다."라고 말합니다. str_replace를 일정량의 교체로 제한하려면 다른 솔루션을 찾아야합니다.
jdhartley

1
첫 번째 두문자어를 확장 버전으로 바꾸려는 경우 교체 횟수를 제한하는 것이 유용 할 수 있습니다. 즉, "WHO"의 첫 번째 항목을 "WHO (세계 보건기구)"로 변경합니다.
Michał Tatarynowicz

strtr이전 대체로 삽입 된 텍스트를 대체하지 않습니다. strtr('foo', array('oo' => 'ie', 'e' => 't'))반환 'fie'대신 'fit'으로 str_replace한다. 따라서 @Pies가 제기 한 문제를 자동으로 해결합니다.
David Harkness 2014 년

21

두 기능 중 하나를 사용하여 똑같은 결과를 얻을 수있는 것 같습니다.

그것은 항상 사실이 아니며 귀하가 제공하는 검색 및 대체 데이터에 따라 다릅니다. 예를 들어 두 함수가 다른 경우 다음을 참조하십시오. PHP str_replace의 문자 제한이 13 자 이상입니까?

  • strtr이미 교체 된 문자열의 일부를 교체하지 않음- str_replace내부 교체를 교체합니다.
  • strtr두 개의 매개 변수로 호출하는 경우 가장 긴 키부터 시작합니다 str_replace. 왼쪽에서 오른쪽으로 바뀝니다.
  • str_replace수행 된 교체 횟수를 반환 할 수 strtr있습니다. 이러한 개수 값을 제공하지 않습니다.

7

strtr두 개의 인수와 함께 사용할 때 더 유연하고 조건부 교체를 제공 한다고 생각 합니다. 이 트릭은 strtr.

$string = "1.10.0001";  
echo strtr($string, array("1" => "a", "10" => "b"));  
// a.b.000a  

참조 : Php Manual Strtr .


2

수동 STRTR에서주의 사항-설명 string strtr (string $ str, string $ from, string $ to) string strtr (string $ str, array $ replace_pairs) 세 개의 인수가 주어지면이 함수는 str 의 복사본 을 반환합니다. 여기서 ...

STR_REPLACE-- ... 검색 또는 바꾸기가 배열 인 경우 해당 요소는 처음부터 마지막까지 처리 됩니다 . ...

STRTR은 다음 턴에 영향을 미치지 않지만 STR_REPLACE는 영향을 미칩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.