$ स्ट्रिंग के साथ एक स्ट्रिंग का पहला चरित्र प्राप्त करना [को ०]


275

मैं एक स्ट्रिंग के पहले अक्षर को प्राप्त करना चाहता हूं और मैंने देखा है कि $str[0]महान काम करता है। मुझे अभी यकीन नहीं है कि क्या यह 'अच्छा अभ्यास' है, क्योंकि इस संकेतन का उपयोग आम तौर पर सरणियों के साथ किया जाता है। यह सुविधा बहुत अच्छी तरह से प्रलेखित नहीं लगती है इसलिए मैं आप लोगों को यह बताने के लिए बदल रहा हूं कि क्या यह सब सही है - सभी मामलों में - इस अंकन का उपयोग करने के लिए?

या मैं सिर्फ अच्छे राज में रहूं substr($str, 0, 1)? '

इसके अलावा, मैंने देखा कि घुंघराले ब्रेसिज़ ( $str{0}) भी काम करते हैं। उसके साथ क्या है?


5
"अच्छा राजभाषा '($ str, 0, 1) के लिए प्लस 1"।
सेंटियागो

जवाबों:


389

हाँ। स्ट्रिंग्स को चरित्र सरणियों के रूप में देखा जा सकता है, और किसी सरणी की स्थिति तक पहुंचने का तरीका []ऑपरेटर का उपयोग करना है। आमतौर पर इसका उपयोग करने में कोई समस्या नहीं है $str[0](और मुझे पूरा यकीन है कि यह substr()विधि की तुलना में बहुत तेज है )।

दोनों विधियों के साथ केवल एक चेतावनी है: उन्हें पहले चरित्र के बजाय पहली बाइट मिलेगी । यदि आप मल्टीबाइट एन्कोडिंग (जैसे UTF-8) का उपयोग कर रहे हैं तो यह महत्वपूर्ण है। यदि आप उस का समर्थन करना चाहते हैं, तो उपयोग करें । यकीनन, आपको हमेशा इन दिनों मल्टीबाइट इनपुट मान लेना चाहिए, इसलिए यह सबसे अच्छा विकल्प है, लेकिन यह थोड़ा धीमा होगा।mb_substr()


7
क्या PHP $ str [0] को ध्यान में रखता है कि 2 बिट लंबे वर्ण हो सकते हैं? UTF और ऐसे? (भले ही पदार्थ () या तो इसके साथ मदद नहीं करता!)
तोमर डब्ल्यू

77
यदि आप अतिरिक्त सुपर सुरक्षित होना चाहते हैं, mb_substr($str, 0, 1, 'utf-8')तो आपको एक मल्टीबीट स्ट्रिंग को अलग नहीं करना चाहिए ।
विक

18
हालांकि यह छोटा है और याद रखने में आसान है substr($str, 0, 1), लेकिन यह भ्रमित करता है कि कौन कोड पढ़ता है।
Trante

10
वर्ग-कोष्ठक और पदार्थ () के बीच का चुनाव काफी हद तक प्राथमिकता का विषय है, लेकिन इस बात से अवगत रहें कि रिक्त स्ट्रिंग पर लागू होने पर परिणाम भिन्न होता है। यदि $ s = "" तो $ s [] === "", लेकिन पदार्थ ($ s, 0, 1) === असत्य है।
xtempore

9
यदि $ s = "" तो $ s [0] एक "सूचना उत्पन्न करेगा: असंगठित स्ट्रिंग ऑफसेट: 0" जबकि पदार्थ ($ s, 0, 1) नहीं होगा।
क्रिस

46

{} सिंटैक्स PHP 5.3.0 के रूप में चित्रित किया गया है। वर्ग कोष्ठक की सिफारिश की जाती है।


14
docs.php.net/language.types.string :Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
VolkerK

4
@VolkerK: आपके द्वारा प्रदान किए गए लिंक पर मैंने देखा कि उन्होंने केवल अपने द्वारा छोड़े गए PHP मैन्युअल पर नोट को हटा दिया था: Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.इसलिए मैं सोच रहा हूं कि क्या उन्होंने फैसला किया कि {}PHP 6 के रूप में अब और उपयोग नहीं किया गया है
Marco Demaio

1
@MarcoDemaio लिंक अब माइकल मॉर्टन जो कहता है वह बताता है।
Tino

1
दरअसल, प्रतिवाद संदेश संशोधन 304,518 में हटा दिया गया है - - "निंदा का कोई संकेत नहीं देता है" The curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254- svn.php.net/repository/phpdoc/en/trunk/language/types/...
VolkerK

आज (१० मई १ May) तक, पसंदीदा PHP डॉक्स से एक उद्धरण : ऐसा Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. लगता है कि इस वाक्यविन्यास पर थोड़ी देर के लिए रुकना है।
Fr0zenFyr

25

कहते हैं कि आप केवल $ _POST के एक हिस्से से पहला चार्ट चाहते हैं, इसे 'प्रकार' कहते हैं। और वह $ _POST ['प्रकार'] वर्तमान में 'नियंत्रण' है। यदि इस मामले में आप का उपयोग करते हैं $_POST['type'][0], या substr($_POST['type'], 0, 1)आप Cवापस मिल जाएगा।

हालाँकि, यदि क्लाइंट पक्ष आपके द्वारा भेजे गए डेटा को संशोधित typeकरने type[]के लिए, उदाहरण के लिए, और फिर इस सरणी के लिए डेटा के रूप में 'नियंत्रण' और 'परीक्षण' भेजते हैं, तो $_POST['type'][0]अब Controlबजाय बदले में वापस आ जाएंगे , Cजबकि substr($_POST['type'], 0, 1)बस विफल हो जाएगा।

तो हां, उपयोग करने में समस्या हो सकती है $str[0], लेकिन यह आसपास की परिस्थिति पर निर्भर करता है।


2
इस विशेष मुद्दे को दरकिनार करने के लिए एक साइड नोट के रूप में और किसी भी मामले में हमेशा डेटा सत्यापन करना चाहिए। if (true === is_string($_POST['type']))
fyrye

13

मेरा एकमात्र संदेह यह होगा कि यह तकनीक मल्टी-बाइट स्ट्रिंग्स पर कैसे लागू होगी, लेकिन अगर यह विचार नहीं है, तो मुझे संदेह है कि आप कवर कर रहे हैं। (यदि संदेह है, तो mb_substr()स्पष्ट रूप से सुरक्षित विकल्प लगता है।)

हालाँकि, एक बड़े चित्र के नजरिए से, मुझे आश्चर्य होता है कि एक महत्वपूर्ण विचार के लिए आपको एक स्ट्रिंग में 'n'th वर्ण तक पहुंचने की कितनी बार आवश्यकता है।


9

यह संसाधनों के आधार पर अलग-अलग होगा, लेकिन आप स्क्रिप्ट को चला सकते हैं और अपने लिए देख सकते हैं;)

<?php
$tests = 100000;

for ($i = 0; $i < $tests; $i++)
{
    $string = md5(rand());
    $position = rand(0, 31);

    $start1 = microtime(true);
    $char1 = $string[$position];
    $end1 = microtime(true);
    $time1[$i] = $end1 - $start1;

    $start2 = microtime(true);
    $char2 = substr($string, $position, 1);
    $end2 = microtime(true);
    $time2[$i] = $end2 - $start2;

    $start3 = microtime(true);
    $char3 = $string{$position};
    $end3 = microtime(true);
    $time3[$i] = $end3 - $start3;
}

$avg1 = array_sum($time1) / $tests;
echo 'the average float microtime using "array[]" is '. $avg1 . PHP_EOL;

$avg2 = array_sum($time2) / $tests;
echo 'the average float microtime using "substr()" is '. $avg2 . PHP_EOL;

$avg3 = array_sum($time3) / $tests;
echo 'the average float microtime using "array{}" is '. $avg3 . PHP_EOL;
?>

कुछ संदर्भ संख्या (एक पुरानी कोरडू मशीन पर)

$ php 1.php 
the average float microtime using "array[]" is 1.914701461792E-6
the average float microtime using "substr()" is 2.2536706924438E-6
the average float microtime using "array{}" is 1.821768283844E-6

$ php 1.php 
the average float microtime using "array[]" is 1.7251944541931E-6
the average float microtime using "substr()" is 2.0931363105774E-6
the average float microtime using "array{}" is 1.7225742340088E-6

$ php 1.php 
the average float microtime using "array[]" is 1.7293763160706E-6
the average float microtime using "substr()" is 2.1037721633911E-6
the average float microtime using "array{}" is 1.7249774932861E-6

ऐसा लगता है कि []या {}ऑपरेटरों का उपयोग कमोबेश एक ही है।


2
अच्छा परीक्षण! एक 3 साल पुराने Xeon से कुछ संख्या: "सरणी []" का उपयोग करते हुए औसत फ्लोट माइक्रोटाइम है। 2.2427082061768E-7 औसत फ्लोट माइक्रोटाइम "रूट ()" का उपयोग करते हुए 3.9647579193115E-7 औसत फ्लोट माइक्रोटाइम का उपयोग करके "सरणी {}" है। 2.1522283554077E-7
एलर्ट वैन कोपरन

सटीक माप के लिए, आपको बेहतर होगा कि लूप से माइक्रोटाइम को बाहर निकालें, और एक ही लूप के भीतर अलग-अलग तरीकों को न मिलाएं।
PypeBros

1
एक ही छोरों के भीतर testAऔर निष्पादन का मिश्रण नहीं करना, testBइसका मतलब है कि आप इस तथ्य का पता लगाने में सक्षम हैं कि testBकैश-किलर है जबकि testAकैश-फ्रेंडली है। जब वे दोनों एक ही लूप में होते हैं, तो उन्हें बहुत समान समय के लिए मापा जाता है क्योंकि testBप्रदूषित testAकैशिंग।
PypeBros

1
इसी तरह, मैं परीक्षण छोरों के भीतर तार या रैंडम उत्पन्न करने से बचूंगा और उन्हें पास में एक सरणी में तैयार करूंगा।
PypeBros

1
-1; संदेहास्पद टाइमिंग मैकेनिज्म को छोड़ दें (एक समय में कई ऑपरेशनों को समय से पहले करना बेहतर होगा; मुझे यह पढ़कर चिंता हुई कि सिर्फ microtime()कॉल करने में लगने वाले समय में अधिकांश समय का अंतर आ जाएगा, हालांकि प्रायोगिक तौर पर ऐसा लगता है सच नहीं है), यहाँ छोटे गति अंतर के बारे में परवाह करने का कोई कारण नहीं है। यह एक सेकंड के दसवें हिस्से का एक अंश है; जब इस है कभी बात करने जा रहे हैं?
मार्क अमेरी

6

एक मात्र नश्वर के रूप में बोलते हुए, मैं साथ रहना होगा $str[0]। जहाँ तक मेरा सवाल है, यह $str[0]एक नज़र में अर्थ को समझने की जल्दी है substr($str, 0, 1)। यह शायद वरीयता के मामले में उबलता है।

जहाँ तक प्रदर्शन जाता है, ठीक है, प्रोफ़ाइल प्रोफ़ाइल प्रोफ़ाइल। :) या आप PHP स्रोत कोड में सहकर्मी कर सकते हैं ...


6
$str = 'abcdef';
echo $str[0];                 // a

6
-1; ओपी का सवाल था कि क्या यह वाक्यविन्यास एक बुरा व्यवहार था, और आपने ... किसी भी टिप्पणी के बिना, वाक्यविन्यास को दोहराते हुए जवाब दिया है? यह कोई उत्तर नहीं है।
मार्क अमेरी

5

मल्टीबाइट (यूनिकोड) के तारों के उपयोग के मामले में str[0]परेशानी हो सकती है। mb_substr()एक बेहतर उपाय है। उदाहरण के लिए:

$first_char = mb_substr($title, 0, 1);

यहाँ कुछ विवरण: UTF-8 स्ट्रिंग का पहला वर्ण प्राप्त करें


इस समाधान के लिए धन्यवाद! यदि पहला पात्र यूनिकोड है, [] काम नहीं है
SunB

1

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


नहीं, एक स्ट्रिंग वर्णों की एक सरणी नहीं है (कम से कम PHP उन दो शब्दों का उपयोग करता है)। -1।
मार्क अमेरी


आंतरिक रूप से @gattsbr वे हैं, लेकिन जहाँ तक PHP द्वारा प्रतिरूपित किए जाने वाले मॉडल की बात है, वे मौलिक रूप से भिन्न हैं। स्क्वायर ब्रैकेट नोटेशन का उपयोग करके एक ऑफसेट तक पहुंचना बहुत ही एकमात्र ऑपरेशन है जो उनके पास सरणियों के साथ आम है; स्ट्रिंग फ़ंक्शंस सरणियों पर काम नहीं करते हैं, न ही वाइका वर्सा, और ऐरे एपेंड सिंटैक्स ( $arr[] = $new_element) स्ट्रिंग्स पर काम नहीं करते हैं। जैसे, मुझे नहीं लगता कि चरित्र सरणियों के रूप में तार की अवधारणा उपयोगी है।
मार्क अमेरी

@markamery php.net मैनुअल को फिर से लिखना और फिर इस तरह की माइनसक्यूल तकनीकी को शामिल करना बेहतर है।
गैट्सब्रिज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.