स्ट्रेट बनाम str_replace का उपयोग कब करें?


86

मुझे यह समझने में कठिन समय हो रहा है कि कब 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

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


3
एक पठनीयता के दृष्टिकोण से, strtrआसानी से गलत हो सकता है strstrजो कि काफी अलग है। मुझे लगने लगा है कि मैं डिस्लेक्सिक हूं। Str_replace के साथ वह गलती नहीं होगी।
प्रोग्रामर

जवाबों:


135

पहला अंतर:

के बीच एक अलग व्यवहार का एक दिलचस्प उदाहरण 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" (क्योंकि हमारे सरणी के अनुसार B = D)

इस कार्य को करने के लिए, इसके बजाय "स्ट्रेट" का उपयोग करें:

<?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: हाइपरटेक्स्ट प्रीप्रोसेसर"


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

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

  • स्ट्रेट : यह अपने मापदंडों को लंबाई के आधार पर क्रम से घटाता है, इसलिए:

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

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

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

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

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

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


2
आह ठीक है धन्यवाद! मुझे महसूस नहीं हुआ कि स्ट्रेट लंबाई से अनुवाद कर रहा था - मुझे लगा कि यह रिवर्स ऑर्डर में है।
andrewtweber

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

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

1
प्रतिस्थापन की संख्या को सीमित करना उपयोगी हो सकता है यदि आप किसी परिचित की पहली घटना को विस्तारित संस्करण में बदलना चाहते हैं, अर्थात "WHO" की पहली घटना को "WHO (विश्व स्वास्थ्य संगठन)" में बदलें।
मिचेल टाटेरियोनिज़िक

strtrपिछले प्रतिस्थापन द्वारा सम्मिलित पाठ को प्रतिस्थापित नहीं करेगा। strtr('foo', array('oo' => 'ie', 'e' => 't'))रिटर्न 'fie'के बजाय 'fit'के रूप में str_replaceकरता है। इस प्रकार यह @Pies द्वारा लाए गए मुद्दे को स्वचालित रूप से संबोधित करता है।
डेविड हार्कस

21

ऐसा लगता है कि फ़ंक्शन का उपयोग करके सटीक समान परिणाम प्राप्त करना संभव है

यह हमेशा सच नहीं होता है और आपके द्वारा प्रदान किए गए डेटा की खोज और प्रतिस्थापन पर निर्भर करता है। उदाहरण के लिए, जहां दो फ़ंक्शन भिन्न होते हैं: क्या PHP str_replace की 13 से अधिक वर्ण सीमा है?

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

7

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

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

देखें: Php मैनुअल स्ट्रेट


2

मैनुअल STRTR में सूचना - स्ट्रिंग स्ट्रिंग (स्ट्रिंग $ str, स्ट्रिंग $ से, स्ट्रिंग $ से) स्ट्रिंग स्ट्रेट (स्ट्रिंग $ str, सरणी $ प्रतिस्थापन_ जोड़े) यदि तीन तर्क दिए गए हैं, तो यह फ़ंक्शन str की एक प्रति लौटाता है जहां ...

STR_REPLACE-- ... यदि खोज या प्रतिस्थापित सरणियाँ हैं, तो उनके तत्वों को पहले अंतिम रूप से संसाधित किया जाता है । ...

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.