2011-11-18 16 views
65

मुझे strtrstr_replace या इसके विपरीत के लिए बेहतर होगा जब मुझे मुश्किल समय समझ रहा है। ऐसा लगता है कि किसी भी फ़ंक्शन का उपयोग करके सटीक एक ही परिणाम प्राप्त करना संभव है, हालांकि ऑर्डर जिसमें सबस्ट्रिंग्स को प्रतिस्थापित किया गया है, उलट दिया गया है। उदाहरण के लिए:स्ट्रेट बनाम 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 

वाक्य रचना से, वहाँ एक दूसरे के ऊपर का उपयोग कर के लिए किसी भी लाभ है? कोई भी मामला जहां कोई वांछित परिणाम प्राप्त करने के लिए पर्याप्त नहीं होगा?

+3

एक पठनीयता दृष्टिकोण से, 'strtr' को आसानी से' स्ट्रस्ट्र 'के रूप में गलत तरीके से पढ़ा जा सकता है जो काफी अलग है। मुझे लगता है कि मैं डिस्लेक्सिक हूँ। Str_replace के साथ उस गलती नहीं करेगा। – Programster

उत्तर

104

प्रथम अंतर:

strtr और str_replace के बीच एक अलग व्यवहार के एक दिलचस्प उदाहरण पीएचपी मैनुअल की टिप्पणी अनुभाग में है:

<?php 
$arrFrom = array("1","2","3","B"); 
$arrTo = array("A","B","C","D"); 
$word = "ZBB2"; 
echo str_replace($arrFrom, $arrTo, $word); 
?> 
  • मैं परिणाम के रूप में उम्मीद करेंगे : "ZDDB"
  • हालांकि, यह वापसी: "ZDDD" (Becaus

    <?php 
    $arr = array("1" => "A","2" => "B","3" => "C","B" => "D"); 
    $word = "ZBB2"; 
    echo strtr($word,$arr); 
    ?> 
    
    • यह रिटर्न:: ई बी = डी हमारे सरणी के अनुसार)

    यह काम करने के लिए, "strtr" के बजाय का उपयोग करें "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); 
?> 

पाठ के परिणामस्वरूप लाइनों हो जाएगा:

स्ट्रिंग (3) "PHP"
स्ट्रिंग (27) "PHP: हाइपरटेक्स्ट प्रीप्रोसेसर"


मुख्य स्पष्टीकरण:

यह इसलिए होता है क्योंकि:

  • strtr: यह लंबाई से इसके मापदंडों सॉर्ट करता, अवरोही क्रम में , इसलिए:

    1. यह सबसे बड़ा "अधिक महत्व" देगा, और फिर, क्योंकि विषय टेक्स्ट स्वयं प्रतिस्थापन सरणी की सबसे बड़ी कुंजी है, इसका अनुवाद हो जाता है।
    2. क्योंकि विषय पाठ के सभी वर्णों को प्रतिस्थापित कर दिया गया है, प्रक्रिया समाप्त होती है।
  • str_replace: यह आदेश कुंजी परिभाषित कर रहे हैं में काम करता है, तो:

    1. यह विषय पाठ में महत्वपूर्ण "PHP" पाता है और साथ यह बदल देता है: "PHP: हाइपरटेक्स्ट प्रीप्रोसेसर ", परिणाम के रूप में क्या देता है:

      " PHP: हाइपरटेक्स्ट प्रीप्रोसेसर: हाइपरटेक्स्ट प्रीप्रोसेसर "।

    2. तो यह अगले कुंजी पाता है: "PHP: हाइपरटेक्स्ट प्रीप्रोसेसर" पूर्व कदम की परिणामी पाठ में है, इसलिए इसे "PHP" है, जो परिणाम के रूप में देता है के द्वारा बदल दिया जाता है:

      " PHP: हाइपरटेक्स्ट प्रीप्रोसेसर "।

    3. देखने के लिए कोई और कुंजी नहीं है, इसलिए प्रतिस्थापन वहां समाप्त होता है।

+1

आह ठीक है धन्यवाद! मुझे एहसास नहीं हुआ कि स्ट्रेट लंबाई से अनुवाद कर रहा था - मैंने सोचा कि यह विपरीत क्रम में था। – andrewtweber

+0

php.net में दस्तावेज के रूप में फ़ंक्शन str_replace में 1 और पैरामीटर नाम दिया गया है जो यह इंगित करता है कि प्रतिस्थापन कितनी बार करना चाहिए। लेकिन मैं इस पैरामीटर का उपयोग करने में असमर्थ हूं। क्या किसी को पता है क्यों? –

+1

@ vantrung-cuncon वह पैरामीटर नहीं है। दस्तावेज़ कहते हैं: "यह प्रदर्शन की प्रतिस्थापन की संख्या पर सेट किया जाएगा।" यदि आप str_replace को प्रतिस्थापन की निश्चित मात्रा तक सीमित करना चाहते हैं तो आपको एक और समाधान ढूंढना होगा। – jdhartley

14

ऐसा लगता है कि यह वही परिणाम देगा या तो समारोह

हमेशा सच नहीं है और खोज पर निर्भर करता है कि का उपयोग कर प्राप्त करने और डेटा उपलब्ध कराने को बदलने के लिए संभव है। उदाहरण है, जहां दो समारोह को देखने के अलग के लिए: Does PHP str_replace have a greater than 13 character limit?

  • strtr स्ट्रिंग है जो पहले से ही बदल दिया गया है के कुछ हिस्सों में जगह नहीं होगी - str_replace अंदर का स्थान ले लेगा बदल देता है।
  • strtr यदि आप इसे दो पैरामीटर के साथ कहते हैं तो सबसे लंबी कुंजी से शुरू होगा - str_replace बाएं से दाएं स्थानांतरित होगा।
  • str_replace किए गए प्रतिस्थापन की संख्या वापस कर सकते हैं - strtr इस तरह के गणना मूल्य प्रदान नहीं करता है।
4

मैं strtr जब, दो तर्क के साथ प्रयोग किया, उदाहरण के लिए और अधिक लचीला और सशर्त प्रतिस्थापन प्रदान करता है लगता है: यदि स्ट्रिंग 1, एक के साथ बदलें, लेकिन अगर स्ट्रिंग 10 है, ख के साथ बदलें। यह चाल केवल strtr द्वारा हासिल की जा सकती है।

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

देखें: Php Manual Strtr

1

मैनुअल STRTR-- विवरण स्ट्रिंग strtr (स्ट्रिंग $ str, से स्ट्रिंग $, स्ट्रिंग $ करने के लिए) स्ट्रिंग strtr (स्ट्रिंग $ str, सरणी $ replace_pairs) में सूचना तो तीन तर्कों, इस समारोह रिटर्न दिया str के प्रतिलिपि जहां ...

STR_REPLACE-- ... खोज हैं या बदलने के सरणियों रहे हैं, उनके तत्वों पहले कार्रवाई की जाती है पिछले। ...

एसटीआरटीआर प्रत्येक मोड़ अगले पर प्रभाव नहीं डालता है, लेकिन STR_REPLACE करता है।