পিএইচপি-তে স্প্রিন্টফ ফাংশনটি কেন ব্যবহার করবেন?


188

আমি পিএইচপি ফাংশন স্প্রিন্টফ () সম্পর্কে আরও জানার চেষ্টা করছি তবে php.net আমাকে এতটা সাহায্য করতে পারেনি কারণ আমি এখনও বিভ্রান্ত হয়েছি, আপনি কেন এটি ব্যবহার করতে চান?

নীচে আমার উদাহরণটি দেখুন।

কেন এটি ব্যবহার করুন:

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

যখন এটি একই রকম হয় এবং আইএমও লেখা সহজ হয়:

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

আমি কি এখানে কিছু মিস করছি?


40
+1, ভাল প্রশ্ন। আমি নিজেই এটি খুব কমই ব্যবহার করি, তাই আমি উত্তরগুলি দেখতে আগ্রহী।
জুমব্যাট

6
নোট করুন যে আপনার দুটি উদাহরণ সমতুল্য নয়: প্রথমটি কেবল ফলাফলটি নির্ধারিত করে $output, অন্যটি echoএটির ক্ষেত্রে।
ড্যানিয়েল প্রাইডেন

আমি ব্যক্তিগতভাবে এটিকে ব্যবহার করি যখন আমি প্রচুর জিনিস জোগাড় করি। মূলত পঠনযোগ্যতার জন্য এটি কেবল তখনই দরকারী।
অ্যালেক্সমারলি-ফিঞ্চ

উত্তর:


130

sprintf মূল প্রিন্টফের সমস্ত ফর্ম্যাট করার ক্ষমতা রয়েছে যার অর্থ আপনি কেবল স্ট্রিংগুলিতে ভেরিয়েবল মান সন্নিবেশ করানোর চেয়ে আরও অনেক কিছু করতে পারেন।

উদাহরণস্বরূপ, সংখ্যার ফর্ম্যাট (হেক্স, দশমিক, অষ্টাল), দশমিকের সংখ্যা, প্যাডিং এবং আরও অনেক কিছু নির্দিষ্ট করুন। প্রিন্টফের জন্য গুগল এবং আপনি প্রচুর উদাহরণ পাবেন। Printf, উইকিপিডিয়ার নিবন্ধ আপনাকে শুরু করতে হবে।


46
বছর আগে আমি শূন্য-প্যাডিং সংখ্যাগুলির জন্য একটি দুর্দান্ত ফাংশন লিখেছিলাম। আমি সহজভাবে করতে পারার আগে যুগে যুগে ব্যবহার করা হয়েছিলsprintf('%03d', $num)
DisgruntledGoat

5
পিএইচপি স্প্রিন্টেফের সমস্ত ফর্ম্যাটিং ক্ষমতা রয়েছে ... %,8dউদাহরণস্বরূপ সঠিকভাবে প্রান্তিককরণের জন্য 8 ডিজিট এবং কমাগুলি পৃথক পূর্ণসংখ্য পেতে actually 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

স্প্রিন্টফের জন্য অনেকগুলি ব্যবহারের কেস রয়েছে তবে আমি সেগুলি ব্যবহার করার একটি উপায় হ'ল ডেটাবেজে বা পিএইচপি ক্লাসে ধ্রুবক হিসাবে 'হ্যালো, আমার নাম% s' string আমি যখন স্ট্রিংটি ব্যবহার করতে চাই তখন আমি কেবল এটি করতে পারি:

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

মূলত এটি কোডটিতে কিছু বিচ্ছেদকে অনুমতি দেয়। যদি আমি আমার কোডের অনেক জায়গায় 'হ্যালো, মাই নেম ইজ% এস' ব্যবহার করি তবে আমি এটি এক জায়গায় '% 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
অনুবাদকে এই বাক্যটি

1
যদিও তারা মূল স্ট্রিংটিতে উপস্থিত না থাকলেও আপনি এটিকে অনুবাদে রাখতে পারেন এবং তারা কাজ করবে।
দর্শকদের

17

আমি যে সবচেয়ে ভাল কারণ খুঁজে পেয়েছি তা হ'ল এটি আপনাকে আপনার ভাষার ফাইলে সমস্ত ভাষার স্ট্রিং রাখার অনুমতি দেয় যদি লোকেরা প্রয়োজন অনুসারে অনুবাদ করতে এবং তাদের অর্ডার করতে পারে - তবে আপনি এখনও জানেন যে স্ট্রিংটি যে বিন্যাসে রয়েছে তা নির্বিশেষে - আপনি প্রদর্শন করতে চান ব্যবহারকারীর নাম।

উদাহরণস্বরূপ, আপনার সাইটটি পৃষ্ঠার শীর্ষে "স্বাগতম স্বাগতম [[ব্যবহারকারী]]" বলবে। প্রোগ্রামার হিসাবে আপনি জানেন না বা যত্নশীল UI লোকেরা কীভাবে এটি লিখতে চলেছে - আপনি কেবল জানেন যে কোনও ব্যবহারকারী নাম কোনও বার্তায় কোথাও প্রদর্শিত হতে চলেছে।

সুতরাং আপনি যে বার্তাটি আসলে তা কী তা নিয়ে উদ্বিগ্ন না হয়ে বার্তাটি আপনার কোডটিতে এম্বেড করতে পারেন।

ল্যাং ফাইল (EN_US):

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

তারপরে আপনি এটিকে আপনার আসল পিএইচপি কোডে ব্যবহার করে যে কোনও ভাষায় যে কোনও ধরণের বার্তা সমর্থন করতে পারেন।

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."

Variোকানো ভেরিয়েবলগুলি এমনকি একাধিক ভাষা জুড়ে শুরু বা শেষ হওয়া উচিত নয়, কেবল তাদের ক্রমবিন্যাসের বিষয়গুলি।

অবশ্যই, আপনি এই প্রতিস্থাপনটি সম্পাদন করতে আপনার নিজের ফাংশনটি লিখতে পারেন, নিঃসন্দেহে এমনকি কিছুটা ছোটখাটো পারফরম্যান্স বৃদ্ধি পেয়েও এটি কেবলমাত্র দ্রুততর ( 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

উল্লিখিত হিসাবে, এটি ইনপুট ডেটা ফর্ম্যাট করতে দেয়। উদাহরণস্বরূপ, 2 ডিপি, 4-অঙ্কের সংখ্যা ইত্যাদি জোর করা ইত্যাদি মাইএসকিউএল কোয়েরি স্ট্রিং তৈরির জন্য এটি বেশ কার্যকর।

আরেকটি সুবিধা হ'ল এটি আপনাকে প্যারামিটারগুলিতে খাওয়ানোর মতো স্ট্রিংয়ের লেআউটটিকে এতে দেওয়া ডাটার থেকে আলাদা করতে দেয়। উদাহরণস্বরূপ, একটি মাইএসকিউএল কোয়েরির ক্ষেত্রে:

// 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);

এই পদ্ধতির অবশ্যই অন্যান্য ব্যবহার রয়েছে যেমন এইচটিএমএল হিসাবে আউটপুট প্রিন্ট করার সময় ইত্যাদি have

সম্পাদনা: সুরক্ষার কারণে , উপরে যেমন কোনও প্রযুক্তি ব্যবহার করার সময় আপনাকে mysql_real_escape_string()এই পদ্ধতিটি ব্যবহার করার আগে মাইএসকিউএল সন্নিবেশ আক্রমণকে প্রতিরোধ করতে সমস্ত ইনপুট ভেরিয়েবল স্যানিটাইজ করতে হবেআপনি যদি অ সঞ্চিত ইনপুট পার্স করেন তবে আপনার সাইট এবং সার্ভার হ্যাক হয়ে যাবে । (অবশ্যই, ব্যতিক্রমগুলি যা আপনার কোড দ্বারা সম্পূর্ণরূপে নির্মিত হয়েছে এবং নিরাপদ থাকার গ্যারান্টিযুক্ত ব্যতীত))


2
এই কোডটি এসকিউএল ইঞ্জেকশনের পক্ষে ঝুঁকিপূর্ণ। স্থানধারক ব্যবহার করুন, ইন্টারপোলেশনের জন্য কোয়েরি নয়!
সন্ধ্যা

@ ডুসকুফ - যেমনটি ব্যবহৃত হয়েছে, আপনি ঠিক বলেছেন। দুঃখিত, আমি আমার উত্তর সংশোধন করেছি।
স্যামুয়েল জায়েস্কে

7

আপনার স্ট্রিংটি ফর্ম্যাট করতে স্প্রিন্টফ () ব্যবহার করা অনেক পরিচ্ছন্ন এবং নিরাপদ।

উদাহরণস্বরূপ, আপনি যখন ইনপুট ভেরিয়েবলগুলি নিয়ে কাজ করছেন, এটি আগাম প্রত্যাশিত ফর্ম্যাটটি নির্দিষ্ট করে অপ্রত্যাশিত বিস্ময়গুলি প্রতিরোধ করে (উদাহরণস্বরূপ, আপনি স্ট্রিং [ %s] বা সংখ্যা [ %d] প্রত্যাশা করছেন )। এটি এসকিউএল ইনজেকশন সম্ভাব্য ঝুঁকি নিয়ে সম্ভাব্য সাহায্য করতে পারে , তবে স্ট্রিংয়ের কোট থাকলে এটি প্রতিরোধ করবে না।

এটি ফ্লোটগুলি মোকাবেলা করতেও সহায়তা করে, আপনি স্পষ্ট করে অঙ্কের যথার্থতা (উদাহরণস্বরূপ %.2f) নির্দিষ্ট করতে পারেন যা রূপান্তরকারী কার্যগুলি ব্যবহার থেকে আপনাকে রক্ষা করে ves

অন্যান্য সুবিধাগুলি হ'ল বেশিরভাগ প্রধান প্রোগ্রামিং ভাষার নিজস্ব প্রয়োগ হয় 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 বছর আগে এটি জিজ্ঞাসা করেছি এবং ফিরে ভাবার পরে আমি একবার ব্যবহার করতে পেরেছি তা মনে করতে পারছি না! আমি কোনও দিন এটির জন্য একটি জায়গা খুঁজে পেতে আশা করি এবং বিশ্বাস করি যে এটির কোনও জায়গা আছে তবে মজার বিষয় মনে করে আমি বহু বছর আগে এই প্রশ্নটি জিজ্ঞাসা করার পর থেকে এটি ব্যবহার করি নি!
জেসনডাভিস

আমি বলতে পারি যে পিএইচপি-তে PDO এর জন্য ভেরিয়েবল নির্ধারণের সাথে এটি কিছুটা মিল। এছাড়াও যদি আপনি এটিকে পঠনযোগ্যতা যুক্তি দিতে চান তবে সেই ক্ষেত্রে আমি 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>"। যাইহোক, ব্যবহারকারীর ইনপুট স্যানিটাইজ করতে ভুলবেন না বা আপনি আপনার কোডটি এক্সএসএস দুর্বলতার জন্য খোলে।
তৃতীয় দিন

আপনি 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

কিছু সাধারণ ক্ষেত্রে এমন হয় যেখানে আউটপুট ফর্ম্যাটের উপর আপনার আরও সঠিক নিয়ন্ত্রণের প্রয়োজন হয়। উদাহরণস্বরূপ এটি নিশ্চিত করা কঠিন যে কোনও নির্দিষ্ট মানের দৈর্ঘ্যের উপর নির্ভর করে সামনের দিকে নির্দিষ্ট প্যাডযুক্ত স্পেসের নির্দিষ্ট পরিমাণ রয়েছে বা একটি নির্দিষ্ট সুনির্দিষ্ট বিন্যাসে একটি সংখ্যা আউটপুট করা হয়েছে তা নিশ্চিত করুন।

পিএইচপি ম্যানুয়ালটিতে প্রচুর উদাহরণ রয়েছে

এছাড়াও আপনার "লিখতে সহজ" এর উদাহরণটিতে যা আসে .. যদিও প্রতিধ্বনি লেখা সহজ হতে পারে তবে স্প্রিন্টফ পড়া সহজ, বিশেষত আপনার যদি প্রচুর ভেরিয়েবল থাকে।

স্প্রিন্টফ বা প্রিন্টফ ব্যবহারের আর একটি কারণ হতে পারে যে আপনি কোনও ব্যবহারকারীর কিছু মানের আউটপুট ফর্ম্যাটটি সংজ্ঞায়িত করতে চান - আপনি তাদের একটি স্প্রিন্টফ সামঞ্জস্যপূর্ণ আউটপুট ফর্ম্যাটটি সংজ্ঞায়িত করতে অনুমতি দিতে পারেন।

ওহ, এবং আপনার উদাহরণটি এক অংশের জন্য আসলে ভুল। sprintfস্ট্রিংটি ফিরিয়ে দেয়, তবে echoতা দেয় না - echoতাৎক্ষণিকভাবে এটিকে আউটপুট করে এবং কিছুই দেয় না, যখন sprintfকেবল তা ফিরিয়ে দেয়।


3
  1. আপনি যদি সি / সি ++ ব্যবহার করেন তবে আপনি স্প্রিন্টফ ফাংশনে অভ্যস্ত হন।

  2. দ্বিতীয় লাইনটি কম দক্ষ হওয়ার একটি ভাল সম্ভাবনা রয়েছে। ইকো একটি আউটপুট কমান্ড হিসাবে ডিজাইন করা হয়েছে, অন্যদিকে স্প্রিন্টফ স্ট্রিং টোকেন প্রতিস্থাপনের জন্য ডিজাইন করা হয়েছে। আমি কোনও পিএইচপি ব্যক্তি নই, তবে আমি সন্দেহ করি যে প্রতিধ্বনিতে আরও কিছু জড়িত রয়েছে। যদি এটি জাভা এর মতো কাজ করে তবে প্রতিবার তালিকায় কিছু যুক্ত হওয়ার সাথে সাথে এটি একটি নতুন স্ট্রিং তৈরি করে, তাই আপনি 4 টি স্ট্রিং তৈরি করে শেষ করবেন।


জাভার সাম্প্রতিক সংস্করণগুলি স্ট্রিং কনটেনটেশনকে পর্দার আড়ালে একটি স্ট্রিংবিল্ডারে রূপান্তর করবে।
রোডিও ক্লাউন

1
পিএইচপি-তে স্ট্রিংগুলি অবজেক্ট নয়। দ্বিতীয় উদাহরণটি ফাংশন কলের পরিবর্তে একটি ভাষা নির্মাণ ব্যবহার করে তাই অনবদ্য দ্রুত গতিতে হবে।
তমলিন

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']);

অবিচ্ছিন্ন টেম্পলেটগুলি (এইচটিএমএল মেল বা অন্যান্য জিনিসের জন্য) করতেও ব্যবহৃত হয়, তাই আপনি টেমপ্লেটটি অনেক জায়গায় আবার ব্যবহার করতে পারেন:

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

এটি বিভিন্ন উপাত্তগুলিতে সংখ্যার ফর্ম্যাট করতেও খুব দরকারী (অষ্টাল, দশমিক স্থান নিয়ন্ত্রণ করুন ইত্যাদি)।


কেবল অন্তর্বাস (use _ GET ["নিবন্ধ_আইডি"]) ব্যবহার করা কি সহজ নয়? ঠিক আছে, আসলে এটি আরও টাইপ করেছে ... * আপনার পদ্ধতিটি "ডাগ ন্যাবিট" নোট করে
ইউজার 97410

এই ধরণের কোডের জন্য, অন্তর্নির্মিত mysql_real_escape_string (): $ কোয়েরি = স্প্রিন্টফ ("নিবন্ধগুলি থেকে id =% d;" নির্বাচন করুন, "mysql_real_escape_string ($ _ GET ['নিবন্ধ_আইডি'])) ব্যবহার করুন);
bruno.braga

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 ব্যবহার করে তবে ইতিবাচক সংখ্যাগুলিতে প্রায় আবৃত হবে। এই আচরণটি এড়াতে, আমি সংখ্যাকে শূন্যের দিকে গোল করে নিখুঁত ফাংশন, অ্যাবস () ব্যবহার করি:

$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পিএইচপি- র সবচেয়ে গুরুত্বপূর্ণ পয়েন্ট , তবে তারপরে এই সংঘাতযুক্ত উদাহরণগুলি দেখে "অনুপস্থিত" থেকে ফল তৈরি করছে ফল :), প্রতিটি বারবার শুধুমাত্র দেখাচ্ছে %d(এবং abs()যা বিষয়ের জন্য অপ্রাসঙ্গিক,) পরিবর্তে সংখ্যা বিন্যাসন বিকল্পগুলি আধিক্য (যা কিছু দেখানো, হবে প্রাসঙ্গিক হতে), আমি আমার মন পরিবর্তন করেছেন। তবে আপনি যদি উত্তরটি আপডেট করেন তবে আমি আপনার জন্য ফ্রিজে আমার উপভোগ করব। :) থেক্স, চিয়ার্স!
জেড

3

ঠিক আছে, sprintf অনেকগুলি দক্ষতা রয়েছে যেমন আমরা নীচের মতো একটি উদাহরণ জানি:

কয়েক মাস আগে আমি ঘন্টা সেকেন্ড রূপান্তর প্রয়োজন ছিল: মিনিট: সেকেন্ড বিন্যাস মতো $t = 494050 //secondsআমি প্রিন্ট করতে চেয়েছিলেন 137 h 14 m 10 sতাই আমি পিএইচপি ফাংশন নিয়ে এসেছেন 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>';

যা নিম্নলিখিত বারের দিকে নিয়ে যায় (পিএইচপি 7.2 সহ আমার স্থানীয় মেশিনে):

লুপস: 10000000

'। ক। $ খ। $ গ। । d। $ ই। $ f 'এর 1.4507689476013 এস প্রয়োজন

"$ a $ b $ c $ d $ e $ f" এর দরকার 1.9958319664001s

স্প্রিন্টফ ('% s% s% s% s% s% s', $ এ, $ বি, $ সি, $ ডি, $ ই, $ এফ) এর 9.1771278381348s প্রয়োজন


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);

অবশ্যই এটি একটি অতিরিক্ত পদক্ষেপ তবে কী যদি আপনার শর্তাধীন চেকগুলি অন্যান্য ক্রিয়ামূলক কিছু কাজ করে তবে কোটেশন এবং সংযোজন কার্যকরীভাবে কোডিংয়ের পথে আসতে শুরু করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.