PHP में स्प्रिंटफ फ़ंक्शन का उपयोग क्यों करें?


188

मैं PHP फ़ंक्शन स्प्रिंटफ़ () के बारे में अधिक जानने की कोशिश कर रहा हूं, लेकिन php.net ने मेरी बहुत मदद नहीं की क्योंकि मैं अभी भी भ्रमित हूं, आप इसका उपयोग क्यों करना चाहेंगे?

नीचे मेरे उदाहरण पर एक नज़र डालें।

इसका उपयोग क्यों करें:

$output = sprintf("Here is the result: %s for this date %s", $result, $date);

जब यह ऐसा ही करता है और IMO लिखना आसान होता है:

$output = 'Here is the result: ' .$result. ' for this date ' .$date;

क्या मुझसे कोई चूक हो रही है?


40
+1, अच्छा सवाल। मैं शायद ही कभी इसका इस्तेमाल करता हूं, इसलिए मुझे जवाब देखने में दिलचस्पी है।
जोबट

6
ध्यान दें कि आपके दो उदाहरण समतुल्य नहीं हैं: पहला वाला केवल परिणाम को बताता है $output, जबकि दूसरा echoइसे।
डैनियल प्राइडेन

मैं व्यक्तिगत रूप से इसका इस्तेमाल करता हूं जब मैं बहुत सारी चीजों को समेटता हूं। यह वास्तव में केवल तब है कि मुझे यह उपयोगी लगता है, मुख्य रूप से पठनीयता के लिए।
एलेक्समॉर्ली-फिंच

जवाबों:


130

sprintf मूल प्रिंटफ की सभी प्रारूपण क्षमताएं हैं, जिसका अर्थ है कि आप स्ट्रिंग में केवल चर मान सम्मिलित करने की तुलना में बहुत अधिक कर सकते हैं।

उदाहरण के लिए, संख्या प्रारूप (हेक्स, दशमलव, अष्टक), दशमलव की संख्या, पैडिंग और अधिक निर्दिष्ट करें। प्रिंट के लिए Google और आपको बहुत सारे उदाहरण मिलेंगे। Printf पर विकिपीडिया लेख आप आरंभ करना चाहिए।


46
वर्षों पहले मैंने शून्य-गद्दी संख्याओं के लिए एक अच्छा कार्य लिखा था। साकार करने से पहले उम्र के लिए इस्तेमाल कियाsprintf('%03d', $num)
DisgruntledGoat

5
PHP स्प्रिंटफ में सभी स्वरूपण क्षमताएं हैं ... वास्तव में एक महत्वपूर्ण याद आ रही है, %,8dउदाहरण के लिए सही ढंग से संरेखित 8 अंक और अल्पविराम से अलग पूर्णांक। उपयोग करना number_formatएक printfशैली में कम सुविधाजनक है ।
e2-e4

3
@DisgruntledGoat क्या आप उस स्वरूपण स्ट्रिंग को तोड़ सकते हैं ('% 03d')? मुझे लगता है कि यह वास्तव में मददगार होगा। धन्यवाद।
मिस्टर स्मि

3
आप प्रदर्शित करने के लिए तर्कों को दोहरा सकते हैं और पुन: व्यवस्थित कर सकते हैं। जैसे sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');, जिसके परिणामस्वरूपHello World, my name is also World.
fyrye

77

स्प्रिंटफ के लिए कई उपयोग के मामले हैं, लेकिन एक तरीका है कि मैं उनका उपयोग इस तरह से एक स्ट्रिंग को संग्रहीत करके कर रहा हूं: डेटाबेस में या PHP वर्ग में एक स्थिरांक के रूप में 'हैलो, माई नेम% s'। इस तरह से जब मैं उस स्ट्रिंग का उपयोग करना चाहता हूं तो मैं बस यह कर सकता हूं:

$name = 'Josh';
// $stringFromDB = 'Hello, My Name is %s';
$greeting = sprintf($stringFromDB, $name);
// $greetting = 'Hello, My Name is Josh'

अनिवार्य रूप से यह कोड में कुछ अलगाव की अनुमति देता है। यदि मैं अपने कोड में कई स्थानों पर 'Hello, My Name% s' का उपयोग करता हूं, तो मैं इसे एक स्थान पर '% s मेरा नाम है' में बदल सकता है और यह हर जगह और स्वचालित रूप से अपडेट होता है, बिना प्रत्येक उदाहरण के जाने और इधर-उधर जाने के लिए concatenations।


8
यह। अब गिने हुए तर्कों और अनुवादों को जोड़ें:]
कोनरक

46

एक अन्य उपयोग sprintfस्थानीयकृत अनुप्रयोगों में होता है क्योंकि उन्हें तर्क sprintfस्ट्रिंग में दिखाई देने वाले क्रम में नहीं होना चाहिए।

उदाहरण:

$color = 'blue';
$item = 'pen';

sprintf('I have a %s %s', $color, $item);

लेकिन फ्रांसीसी जैसी भाषा शब्दों को अलग तरह से आदेश देती है:

$color = 'bleu';
$item = 'stylo';

sprintf('J\'ai un %2$s %1$s', $color, $item);

(हाँ, मेरा फ्रेंच बेकार है: मैंने स्कूल में जर्मन सीखा है!)

वास्तव में, आप स्थानीयकृत स्ट्रिंग को संग्रहीत करने के लिए गेटटेक्स्ट का उपयोग करेंगे लेकिन आपको इसका विचार है।



37

अनुवाद करना आसान है।

echo _('Here is the result: ') . $result . _(' for this date ') . $date;

अनुवाद (गेटटेक्स्ट) तार अब हैं:

  • यहाँ परिणाम है:
  • इस तिथि के लिए

जब किसी अन्य भाषा में अनुवाद किया जाता है तो यह असंभव हो सकता है या इसके परिणाम बहुत ही अजीब हो सकते हैं।

अब अगर आपके पास है

echo sprintf(_("Here is the result: %s for this date %s"), $result, $date);

अनुवाद (गेटटेक्स्ट) तार अब है:

  • यहाँ परिणाम है: इस तिथि के लिए% s% s

जो बहुत अधिक समझ में आता है और यह अन्य भाषाओं में अनुवाद करने के लिए अधिक लचीला है


1
मैं देखता हूं कि यह कहां बहुत उपयोगी होगा +1
जेसनडेविस

6
हालाँकि अनुवादों के लिए यह बेहतर होगा कि स्थिति विनिर्देशकों का उपयोग किया जाए, अनुवाद करते समय कुछ अतिरिक्त लचीलेपन की अनुमति देने के लिए, यानी: echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);अनुवाद को वाक्यांश को संशोधित करने की अनुमति देगा जैसेFor the date %2$s, the result is %1$s
PatrikAkerstrand

1
यद्यपि वे मूल स्ट्रिंग में मौजूद नहीं हैं, तो भी आप उन्हें अनुवाद में डाल सकते हैं और वे काम करेंगे।
स्पेक्टर्स

17

सबसे अच्छा कारण जो मैंने पाया है, वह यह है कि आप अपनी भाषा फ़ाइल में सभी भाषा के तार डाल सकते हैं, लोग अनुवाद कर सकते हैं और आवश्यकतानुसार उन्हें ऑर्डर कर सकते हैं - फिर भी आप अभी भी जानते हैं कि स्ट्रिंग किस प्रारूप में है - आप दिखाना चाहते हैं उपयोगकर्ता नाम।

उदाहरण के लिए, आपकी साइट पृष्ठ के शीर्ष पर "आपका स्वागत है [[उपयोगकर्ता]]" कहेगी। प्रोग्रामर के रूप में आप यह नहीं जानते या परवाह नहीं करते हैं कि यूआई लोग कैसे लिखने जा रहे हैं - आप बस यह जानते हैं कि एक उपयोगकर्ता नाम एक संदेश में कहीं दिखाया जाने वाला है।

तो आप इस संदेश को वास्तव में क्या है के बारे में चिंता किए बिना संदेश को अपने कोड में एम्बेड कर सकते हैं।

लैंग फ़ाइल (EN_US):

...
$lang['welcome_message'] = 'Welcome back %s';
...

फिर आप अपने वास्तविक php कोड में इसका उपयोग करके किसी भी भाषा में किसी भी प्रकार के संदेश का समर्थन कर सकते हैं।

sprintf($lang['welcome_message'], $user->name())

मुझे भाषा फ़ाइलों को करने के बारे में चिंता करने की आवश्यकता नहीं है, लेकिन यह मेरे लिए सबसे उपयोगी उपयोगों में से एक लगता है
जेसनडेविस

यह उदाहरण मेरे लिए भी सही अर्थ है क्योंकि मैंने बहुत से बहुभाषी अनुप्रयोग नहीं किए हैं।
एमकेएन वेब सॉल्यूशंस

9

आप इसका उपयोग क्यों करना चाहेंगे?

भाषा के तार के लिए (बाहरी) स्रोत का उपयोग करते समय यह बहुत उपयोगी साबित होता है। यदि आपको किसी दिए गए बहुभाषी स्ट्रिंग में निश्चित संख्या में चर की आवश्यकता है, तो आपको केवल सही क्रम जानने की आवश्यकता है:

en.txt

not_found    = "%s could not be found."
bad_argument = "Bad arguments for function %s."
bad_arg_no   = "Bad argument %d for function %s."

hu.txt

not_found    = "A keresett eljárás (%s) nem található."
bad_argument = "Érvénytelen paraméterek a(z) %s eljárás hívásakor."
bad_arg_no   = "Érvénytelen %d. paraméter a(z) %s eljárás hívásakor."

सम्मिलित चर भी कई भाषाओं में शुरुआत या अंत में नहीं होते हैं, केवल उनके आदेश मायने रखते हैं।

बेशक, आप इसे प्रतिस्थापित करने के लिए अपना स्वयं का कार्य लिख सकते हैं, निस्संदेह यहां तक ​​कि कुछ मामूली प्रदर्शन बढ़ जाते हैं, लेकिन यह सिर्फ करने के लिए बहुत तेज़ है (आपको Languageभाषा के तार पढ़ने के लिए एक वर्ग है) :

/**
 * throws exception with message($name = "ExampleMethod"):
 *  - using en.txt: ExampleMethod could not be found.
 *  - using hu.txt: A keresett eljárás (ExampleMethod) nem található.
 */
throw new Exception(sprintf(Language::Get('not_found'), $name));

/**
 * throws exception with message ($param_index = 3, $name = "ExampleMethod"):
 *  - using en.txt: Bad argument 3 for function ExampleMethod.
 *  - using hu.txt: Érvénytelen 3. paraméter a(z) ExampleMethod eljárás hívásakor.
 */
throw new Exception(sprintf(Language::Get('bad_arg_no'), $param_index, $name));

यह भी पूर्ण क्षमताओं के साथ आता है printf, इस प्रकार कई प्रकार के चर को प्रारूपित करने के लिए एक-लाइनर भी है, उदाहरण के लिए:


8

जैसा कि उल्लेख किया गया है, यह इनपुट डेटा को प्रारूपित करने की अनुमति देता है। उदाहरण के लिए, 2dp, 4-अंकीय संख्याओं को बाध्य करना, आदि यह MySQL क्वेरी स्ट्रिंग्स के निर्माण के लिए काफी उपयोगी है।

एक और लाभ यह है कि यह आपको स्ट्रिंग के लेआउट को इसमें खिलाए जाने वाले डेटा से अलग करने की अनुमति देता है, लगभग पैरामाटर्स में खिलाने की तरह। उदाहरण के लिए, MySQL क्वेरी के मामले में:

// For security, you MUST sanitise ALL user input first, eg:
$username = mysql_real_escape_string($_POST['username']); // etc.
// Now creating the query:
$query = sprintf("INSERT INTO `Users` SET `user`='%s',`password`='%s',`realname`='%s';", $username, $passwd_hash, $realname);

इस पद्धति के अन्य उपयोग हैं, जैसे कि HTML के रूप में आउटपुट प्रिंट करते समय, आदि।

संपादित करें: सुरक्षा कारणों से , जब आपmysql_real_escape_string() ऊपर बताए गए तकनीक का उपयोग कर रहे हों , तो आपको इस विधि का उपयोग करने से पहले सभी इनपुट चरों को सैनिटाइज करना होगा , ताकि MySQL सम्मिलन के हमलों को रोका जा सके। यदि आप बिना इनपुट इनपुट के पार्स करते हैं, तो आपकी साइट और सर्वर हैक हो जाएंगे । (अपवाद के साथ, निश्चित रूप से, चर जो आपके कोड द्वारा पूरी तरह से निर्मित किए गए हैं और सुरक्षित रहने की गारंटी है।)


2
यह कोड SQL इंजेक्शन के लिए असुरक्षित है। प्लेसहोल्डर का उपयोग करें, क्वेरी प्रक्षेप नहीं!
डस्कवफ-सक्रिय-

@duskwuff - जैसा कि है, आप सही कह रहे हैं। क्षमा करें, मैंने अपना उत्तर संशोधित कर दिया है।
शमूएल जैशेके

7

स्प्रिंटफ () का उपयोग करना आपके स्ट्रिंग को प्रारूपित करने के लिए बहुत क्लीनर और सुरक्षित है।

उदाहरण के लिए जब आप इनपुट चर के साथ काम कर रहे होते हैं, तो यह अग्रिम रूप में अपेक्षित प्रारूप निर्दिष्ट करके अप्रत्याशित आश्चर्य को रोकता है (उदाहरण के लिए, कि आप स्ट्रिंग की उम्मीद कर रहे हैं [ %s] या संख्या [ %d]]। यह संभावित रूप से SQL इंजेक्शन के संभावित जोखिम के साथ मदद कर सकता है , लेकिन यह स्ट्रिंग को कोट करने से नहीं रोकेगा।

यह फ़्लोट्स से निपटने में भी मदद करता है, आप स्पष्ट रूप से अंक परिशुद्धता (जैसे %.2f) निर्दिष्ट कर सकते हैं जो आपको परिवर्तित कार्यों का उपयोग करने से बचाता है।

अन्य लाभ यह है कि अधिकांश प्रमुख प्रोग्रामिंग भाषाओं का अपना कार्यान्वयन है sprintf(), इसलिए एक बार जब आप इसके साथ परिचित हो जाते हैं, तो एक नई भाषा सीखने के बजाय (जैसे कि कैसे तारों को जोड़ना या फ़्लोट्स को परिवर्तित करना) उपयोग करना और भी आसान हो जाता है।

सारांश में, एक क्लीनर और अधिक पठनीय कोड के लिए उपयोग करना एक अच्छा अभ्यास है।

उदाहरण के लिए, नीचे दिया गया वास्तविक उदाहरण देखें :

$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";

या कुछ सरल उदाहरण जो प्रिंट करता है जैसे '1','2','3','4':

print "foo: '" . $a . "','" . $b . "'; bar: '" . $c . "','" . $d . "'" . "\n";

और स्वरूपित स्ट्रिंग के साथ मुद्रण:

printf("foo: '%d','%d'; bar: '%d','%d'\n", $a, $b, $c, $d);

जहां printf()के बराबर है sprintf(), लेकिन यह इसे (चर के लिए) वापस करने के बजाय एक स्वरूपित स्ट्रिंग को आउटपुट करता है।

कौन सा अधिक पठनीय है?


1
मैं इससे सहमत नहीं हूं, लेकिन यह भी ध्यान देने योग्य है कि मैंने 6-7 साल पहले यह पूछा था और यह सोचकर कि मैं तब से एक बार भी याद नहीं कर सकता, जब से मैंने इसका इस्तेमाल किया है! मैं किसी दिन इसके लिए एक जगह खोजने की उम्मीद करता हूं और विश्वास करता हूं कि यह एक जगह है, लेकिन यह सोचने के लिए अजीब है कि मैंने इस सवाल को पूछने के बाद से इसका इस्तेमाल नहीं किया है!
जेसनडेविस

मैं कह सकता हूं कि यह PHP में पीडीओ के लिए चर सेट करने के समान है। इसके अलावा अगर आप इसे पठनीयता का तर्क देना चाहते हैं, तो उस स्थिति में मैं sprintf()कई लाइनों में टूटे हुए का उपयोग करना पसंद करता हूं, जहां प्लेसहोल्डर्स के साथ स्ट्रिंग 1 लाइन पर है और इसके नीचे मान एक लाइन या कई लाइनों पर हैं, सभी सही ढंग से इंडेंट किए गए हैं पाठ्यक्रम। मेरे द्वारा बताए गए तरीके से अपने डेमो का उपयोग करना ... i.imgur.com/DFi3ur8.png
जेसनडेविस

संग्रहीत प्रक्रियाओं के साथ संयोजन में तैयार किए गए बयान एसक्यूएल इंजेक्शन को रोकने का सबसे अच्छा तरीका है, स्प्रिंटफ नहीं।
स्प्रिंट

4

हालांकि, जब तक कि मैंने हाल ही में इसका इस्तेमाल नहीं किया, तब भी यही बात है। जब आप उपयोगकर्ता इनपुट के आधार पर दस्तावेज बनाते हैं तो यह काम में आएगा।

"<p>Some big paragraph ".$a["name"]." again have tot ake care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragarapoh.";

जिसे आसानी से लिखा जा सकता है

sprintf("Some big paragraph %s. Again have to take care of space and stuff.%s also wouldnt be hard to keep track of punctuations and stuff in a really %s paragraph",$a,$b,$c);

या आप यह कर सकते हैं "<p>Some big paragraph {$a['name']} more words {$a['age']}</p>":। फिर भी, उपयोगकर्ता इनपुट को सैनिटाइज़ करने के लिए न भूलें या आप XSS की कमजोरियों तक अपना कोड खोलें।
थर्डेंडर

आप HEREDOC सिंटैक्स का भी उपयोग कर सकते हैं । मेरी राय में, स्प्रिंटफ सिंटैक्स की तुलना में दोनों को पढ़ना आसान है।
थर्डेंडर

4

यह:

"<p>Some big paragraph ".$a["name"]." again have to take care of space and stuff .". $a["age"]. "also would be hard to keep track of punctuations and stuff in a really ".$a["token"]. paragraph.";

यह भी लिखा जा सकता है:

"<p>Some big paragraph {$a['name']} again have to take care of space and stuff .{$a['age']} also would be hard to keep track of punctuations and stuff in a really {$a['token']} paragraph.";

मेरी राय में यह पढ़ने के लिए स्पष्ट है, लेकिन मैं स्थानीयकरण, या स्वरूपण के लिए उपयोग देख सकता हूं।


3

कुछ विशिष्ट मामले ऐसे हैं जहां आपको आउटपुट प्रारूप पर अधिक सटीक नियंत्रण की आवश्यकता होती है। यह उदाहरण के लिए मुश्किल हो सकता है सुनिश्चित करें कि एक विशिष्ट मूल्य में विशिष्ट स्थानों की मात्रा होती है, जो इसकी लंबाई के आधार पर होती है, या यह कि एक विशिष्ट सटीक प्रारूप में एक नंबर आउटपुट होता है।

PHP मैनुअल में बहुत सारे उदाहरण हैं

इसके अलावा "आसान लिखने के लिए" के उदाहरण में क्या आता है .. जबकि गूंज को लिखना आसान हो सकता है, स्प्रिंट को पढ़ना आसान है, खासकर यदि आपके पास बहुत सारे चर हैं।

स्प्रिंटफ या प्रिंटफ का उपयोग करने का एक और कारण यह हो सकता है कि आप उपयोगकर्ता को कुछ मूल्य के आउटपुट स्वरूप को परिभाषित करने देना चाहते हैं - आप सुरक्षित रूप से उन्हें स्प्रिंटफ संगत आउटपुट प्रारूप को परिभाषित करने की अनुमति दे सकते हैं।

ओह, और आपका उदाहरण वास्तव में एक भाग के लिए गलत है। sprintfस्ट्रिंग लौटाता है, लेकिन echoनहीं करता है - echoतुरंत इसे आउटपुट करता है और कुछ भी नहीं देता है, जबकि sprintfबस इसे वापस करता है।


3
  1. यदि आपने C / C ++ का उपयोग किया है, तो आप स्प्रिंटफ फ़ंक्शन का उपयोग करेंगे।

  2. एक अच्छी संभावना है कि दूसरी पंक्ति कम कुशल है। इको को आउटपुट कमांड के रूप में डिज़ाइन किया गया है, जबकि स्प्रिंटफ को स्ट्रिंग टोकन प्रतिस्थापन के लिए डिज़ाइन किया गया है। मैं एक PHP व्यक्ति नहीं हूं, लेकिन मुझे संदेह है कि गूंज के साथ अधिक वस्तुएं शामिल हैं। यदि यह जावा की तरह कार्य करता है, तो यह हर बार सूची में कुछ जोड़ने के लिए एक नया स्ट्रिंग बनाता है, इसलिए आप बनाए गए 4 स्ट्रिंग के साथ समाप्त हो जाएंगे।


जावा के हालिया संस्करण स्ट्रिंग के संगति को पर्दे के पीछे एक स्ट्रिंगबर्ल में बदल देंगे।
रोडियोक्लब

1
PHP में स्ट्रिंग्स ऑब्जेक्ट नहीं हैं। दूसरा उदाहरण एक फ़ंक्शन कॉल के बजाय एक भाषा निर्माण का उपयोग करता है, इसलिए यह स्पष्ट रूप से तेज़ होगा।
तमलिन

3

कभी-कभी मुझे कुछ ऐसा मिलता है, जिसे मैं पढ़ना आसान समझता हूं:

$fileName = sprintf('thumb_%s.%s', 
                    $fileId,
                    $fileInfo['extension']);

3

मैं आमतौर पर स्प्रिंटफ का उपयोग यह सुनिश्चित करने के लिए करता हूं कि उपयोगकर्ता इनपुट से आने वाली आईडी उदाहरण के लिए एक पूर्णांक है:

// is better use prepared statements, but this is practical sometimes
$query = sprintf("SELECT * from articles where id = %d;",$_GET['article_id']);

इसका उपयोग अल्पविकसित टेम्पलेट (html मेल या अन्य चीजों के लिए) करने के लिए किया जाता है, इसलिए आप कई स्थानों पर टेम्पलेट का पुन: उपयोग कर सकते हैं:

$mail_body = "Hello %s, ...";
$oneMail = sprintf($mail_body, "Victor");
$anotherMail = sprintf($mail_body, "Juan");

यह विभिन्न अभ्यावेदन (अष्टक, दशमलव स्थान को नियंत्रित करने आदि) में संख्याओं को प्रारूपित करने के लिए भी बहुत उपयोगी है।


क्या केवल इंटवल ($ _ GET ["article_id"]) का उपयोग करना आसान नहीं है? ठीक है, वास्तव में यह अधिक टाइपिंग ले गया ... * नोट डाउन द मेथड "डाग नॅबिट
यूजर 97410

इस प्रकार के कोड के लिए, अंतर्निहित mysql_real_escape_string (): $ क्वेरी = sprintf ("लेखों से आईडी का चयन करें जहां id =% d;", ​​mysql_real_es_string ($ _ GET ['article_id'])) का बेहतर उपयोग करें);
ब्रुना.ब्रगा

3
define('TEXT_MESSAGE', 'The variable "%s" is in the middle!');

sprintf(TEXT_MESSAGE, "Var1");
sprintf(TEXT_MESSAGE, "Var2");
sprintf(TEXT_MESSAGE, "Var3");

3

स्प्रिंटफ विशेष रूप से उपयोगी है जब संख्याओं का उपयोग करने वाले तार को स्वरूपित करते हैं। उदाहरण के लिए,

$oranges = -2.34;
echo sprintf("There are %d oranges in the basket", $oranges);

Output: There are -2 oranges in the basket

संतरे को एक पूर्ण संख्या (-2) के रूप में स्वरूपित किया जाता है, लेकिन यदि कोई बिना बताए मूल्यों के लिए% u का उपयोग करता है, तो यह सकारात्मक संख्याओं में बदल जाएगा। इस व्यवहार से बचने के लिए, मैं निरपेक्ष फ़ंक्शन, abs () का उपयोग करता हूं, इस प्रकार संख्या को शून्य की ओर गोल करने के लिए:

$oranges = -5.67;
echo sprintf("There are %d oranges in the basket", abs($oranges));

Output: There are 5 oranges in the basket

अंतिम परिणाम आवश्यकता के अनुसार अतिरिक्त चर के लिए उच्च पठनीयता, तार्किक निर्माण, स्पष्ट स्वरूपण और लचीलेपन के साथ एक बयान है। चूँकि इन चरों में हेरफेर करने वाले कार्यों के संयोजन में चर की संख्या बढ़ जाती है, इसलिए लाभ अधिक स्पष्ट हो जाते हैं। अंतिम उदाहरण के रूप में:

$oranges = -3.14;
$apples = 1.5;
echo sprintf("There are %d oranges and %d apples", abs($oranges), abs($apples));

Output: There are 3 oranges and 4 apples

स्प्रिंटफ बयान के बाईं ओर स्पष्ट रूप से स्ट्रिंग और अपेक्षित मूल्यों के प्रकार को व्यक्त करता है, जबकि दाईं ओर स्पष्ट रूप से इस्तेमाल किए गए चर को व्यक्त किया है और उन्हें कैसे हेरफेर किया जा रहा है।


मैं इसके विलुप्त होने वाले पहले वाक्य के लिए आपके उत्तर को समाप्त करने वाला था ( " स्प्रिंटफ विशेष रूप से उपयोगी है जब संख्याओं का उपयोग करने वाले तार को प्रारूपित करता है" ), जो वास्तव sprintfमें PHP में सबसे महत्वपूर्ण बिंदु है , लेकिन फिर उन जटिल उदाहरणों को देखकर "लापता" से फल पैदा करना है। फल :), प्रत्येक बार केवल दिखा रहा है %d(और abs(), जो विषय के लिए अप्रासंगिक है), संख्या स्वरूपण विकल्पों में से कुछ की अधिकता दिखाने के बजाय (जो प्रासंगिक होगा ), मैंने अपना मन बदल दिया। लेकिन यदि आप उत्तर को अपडेट करते हैं, तो मैं अभी भी आपके लिए फ्रिज में अपना उत्थान करूंगा। :) Thx, चीयर्स!
एस.जे.

3

ठीक है, sprintf कई क्षमताएं हैं जैसा कि हम नीचे एक उदाहरण जानते हैं:

कुछ महीने पहले मुझे सेकंड को घंटे: मिनट: सेकंड प्रारूप में बदलने की आवश्यकता थी, जैसे $t = 494050 //secondsमैं प्रिंट करना चाहता था, 137 h 14 m 10 sइसलिए मैं php फ़ंक्शन के साथ आया था, springf()मैं बस सेकंड को पकड़ता हूं $tऔर echo sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);मुझे देता है137 h 14 m 10 s

स्प्रिंटफ () फ़ंक्शन बहुत उपयोगी है यदि हम जानते हैं कि इसका उपयोग कैसे करना है।


2

टेम्पलेट का उपयोग करने के लिए तर्क समान है। आप अपने चर ग्रंथों को वास्तविक परिवर्तनशील मूल्यों से अलग करना चाहेंगे। स्प्रिंटफ की अतिरिक्त शक्तियों के अलावा, जिनके बारे में हमने उल्लेख किया है कि यह सिर्फ एक स्टाइल की चीज है।


2

स्प्रिंट का उपयोग करने के लिए वास्तव में अच्छा उपयोग मामला एक स्ट्रिंग में विभिन्न प्रकारों को मिलाकर, संख्याओं के गद्देदार प्रारूपों का उत्पादन और भी है। कई मामलों में पढ़ना आसान हो सकता है और यह एक ही चर के विभिन्न अभ्यावेदन को मुद्रित करने के लिए सुपर सरल बनाता है, विशेषकर संख्यात्मक।


2

साधारण अवतरण के ऊपर स्प्रिंटफ () फ़ंक्शन का उपयोग करने से यह फायदा होता है कि आप विभिन्न प्रकार के स्वरूपणों को लागू करने के लिए चर पर लागू कर सकते हैं।

आपके मामले में, आपके पास है

$output = sprintf("Here is the result: %s for this date %s", $result, $date);

तथा

$output = 'Here is the result: ' .$result. ' for this date ' .$date;

हमें लेने दो $result = 'passed'; date = '23rd';

साधारण संघटन का उपयोग करके आप केवल आउटपुट प्राप्त कर सकते हैं:

Here is the result: passed for this date 23rd

हालाँकि यदि आप उपयोग sprintf()करते हैं तो आप एक संशोधित आउटपुट प्राप्त कर सकते हैं जैसे:

$output = sprintf('Here is the result: %.4s for this date %.2s',$result,$date);
echo $output;

आउटपुट:

Here is the result: pass for this date 23

2

sprintf()के समान है printf()। यदि आप printf()विवरण में जानते हैं sprintf()और तब भी vsprintf()समझना मुश्किल नहीं है।

इनमें से एक चीज जो अलग sprintf()है printf()वह यह है कि आपको फ़ंक्शन से आउटपुट को पकड़ने के लिए एक वैरिएबल की घोषणा करनी होगी क्योंकि यह सीधे कुछ भी प्रिंट / इको नहीं करता है। निम्नलिखित कोड स्निपेट देखें:

printf("Hello %s", "world"); // "Hello world"

sprintf("Hello %s", "world"); // does not display anything

echo sprintf("Hello %s", "world"); // "Hello world"

$a = sprintf("Hello %s", "world"); // does not display anything

echo $a;// "Hello world"

उम्मीद है की वो मदद करदे।



0

छोरों में स्प्रिंट का उपयोग करते समय आपको सावधान रहना होगा:

$a = 'Anton';
$b = 'Bert';
$c = 'Corni';
$d = 'Dora';
$e = 'Emiel';
$f = 'Falk';
$loops = 10000000;

$time = microtime(true);

for ($i = 0; $i < $loops; $i++)
{
    $test = $a . $b . $c . $d . $e . $f;
}

$concatTime = microtime(true) - $time;

$time = microtime(true);

for ($i = 0; $i < $loops; $i++)
{
    $test = "$a $b $c $d $e $f";
}

$concat2Time = microtime(true) - $time;

$time = microtime(true);

for ($i = 0; $i < $loops; $i++)
{
    $test = sprintf('%s %s %s %s %s %s', $a, $b, $c, $d, $e, $f);
}

$sprintfTime = microtime(true) - $time;

echo 'Loops: ' . $loops . '<br>';
echo '\'$a . $b . $c . $d . $e . $f\'' . ' needs ' . $concatTime  . 's<br>';
echo '"$a $b $c $d $e $f"' . ' needs ' . $concat2Time  . 's<br>';
echo 'sprintf(\'%s %s %s %s %s %s\', $a, $b, $c, $d, $e, $f)' . ' needs ' . $sprintfTime  . 's<br>';

जो निम्नलिखित समय की ओर जाता है (PHP 7.2 के साथ मेरी स्थानीय मशीन पर):

लूप्स: 10000000

'$ ए। $ ब। $ सी। $ d $ ई। $ f की जरूरत 1.4507689476013 है

"$ a $ b $ c $ d $ e $ f" को 1.9958319664001 की जरूरत है

स्प्रिंटफ ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) को 9.1771278381348 की जरूरत है


0

मैं इसका उपयोग उपयोगकर्ताओं को संदेश या अन्य "सुंदर" प्रकार की कार्यक्षमता के लिए करता हूं। उदाहरण के लिए अगर मुझे पता है कि मैं उपयोगकर्ता के नाम का उपयोग करने जा रहा हूं।

$name = 'Some dynamic name';

और उस स्थिति में उपयोग करने के लिए कई संदेश हैं। (यानी, किसी अन्य उपयोगकर्ता को रोकना या उसका अनुसरण करना)

$messageBlock = 'You have blocked %s from accessing you.';
$messageFollow = 'Following %s is a great idea!';

आप एक सामान्य फ़ंक्शन बना सकते हैं जो उपयोगकर्ता को कुछ करता है और इस स्ट्रिंग को जोड़ता है, और इससे कोई फर्क नहीं पड़ता कि वाक्य की संरचना कितनी सुंदर दिखनी चाहिए। मैं हमेशा सिर्फ एक साथ तार जोड़ने को नापसंद करता हूं और लगातार डॉट संकेतन का उपयोग कर रहा हूं और एक वाक्य को अच्छा दिखने के लिए तार को बंद करना और फिर से खोलना। मैं सबसे पहले एक प्रशंसक था, लेकिन यह बहुत उपयोगी लगता है जब कई तारों को हेरफेर करने की आवश्यकता होती है और आप हर बार चर के प्लेसमेंट को हार्ड कोड नहीं करना चाहते हैं।

इसके बारे में सोचो, क्या बेहतर दिखता है?

return $messageOne === true ? $name.'. Please use the next example' : 'Hi '.$name.', how are you?'

या

$message = $messageOne === true ? 'Option one %s' 
: ($messageTwo === true ? 'Option Two %s maybe?' : '%s you can choose from tons of grammatical instances and not have to edit variable placement and strings');

return sprintf($message, $name);

सुनिश्चित करें कि यह एक अतिरिक्त कदम है लेकिन क्या होगा यदि आपकी सशर्त जांचें अन्य कार्यात्मक चीजों का एक गुच्छा बनाती हैं, तो कार्यात्मक रूप से कोडिंग के तरीके से उद्धरण और अपेंडिंग शुरू हो जाते हैं।

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