$ Str [0] দিয়ে একটি স্ট্রিংয়ের প্রথম অক্ষর অর্জন করা


275

আমি একটি স্ট্রিংয়ের প্রথম চিঠি পেতে চাই এবং আমি লক্ষ্য করেছি যে $str[0]দুর্দান্ত কাজ করে। আমি ঠিক নিশ্চিত নই যে এটি 'ভাল অনুশীলন' কিনা, কারণ যে চিহ্নটি অ্যারেতে সাধারণত ব্যবহৃত হয়। এই বৈশিষ্ট্যটি খুব ভাল নথিবদ্ধ বলে মনে হচ্ছে না তাই আমি এই চিহ্নটি ব্যবহার করার জন্য - সমস্ত ক্ষেত্রে - সবদিক থেকে ঠিক আছে কিনা তা বলার জন্য আমি আপনাকে বলছি?

অথবা আমি কি ভাল ওলকে আটকে রাখতে পারি substr($str, 0, 1)?

এছাড়াও, আমি লক্ষ করেছি যে কোঁকড়া ধনুর্বন্ধনী ( $str{0}) পাশাপাশি কাজ করে। কি হয়েছে?


5
"ভাল ওল 'সাবস্ট্রটারের জন্য প্লাস 1 ($ স্ট্রিং, 0, 1)"।
সান্টিয়াগো

উত্তর:


389

হ্যাঁ. স্ট্রিংগুলিকে চরিত্রের অ্যারে হিসাবে দেখা যেতে পারে এবং অ্যারের কোনও অবস্থান অ্যাক্সেস করার উপায়টি []অপারেটরটি ব্যবহার করা । সাধারণত ব্যবহারে কোনও সমস্যা নেই $str[0](এবং আমি নিশ্চিত যে substr()পদ্ধতিটির চেয়ে অনেক দ্রুত )।

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


7
পিএইচপি এইচআরআরআর [0] অ্যাকাউন্টে বিবেচনা করে যে 2 বাইট দীর্ঘ চর থাকতে পারে? ইউটিএফ এবং এ জাতীয়? (যদিও সাবস্ট্রাস্ট () এটির সাথেও কোনও সহায়তা করে না!)
টোমর ডাব্লু

77
আপনি যদি অতিরিক্ত সুপার নিরাপদ হতে চান তবে আপনার সাথে চলতে হবে mb_substr($str, 0, 1, 'utf-8')যাতে আপনি কোনও মাল্টিবাইট স্ট্রিংটি কেটে না ফেলে।
ভিক

18
যদিও এটি সংক্ষিপ্ত এবং এর চেয়ে মনে রাখা সহজ substr($str, 0, 1), এই কোডটি কে পড়ছে তা বিভ্রান্ত করে।
trante

10
বর্গক্ষেত্র-বন্ধনী এবং সাবস্ট্রটার () এর মধ্যে পছন্দ মূলত পছন্দের বিষয়, তবে সচেতন থাকুন যে খালি স্ট্রিংয়ের ক্ষেত্রে প্রয়োগ করা হলে ফলাফলটি আলাদা হয়। যদি $ s = "" তবে $ গুলি [] === "" তবে সাবস্ট্রাস্ট ($ গুলি, 0, 1) === মিথ্যা।
xtempore

9
যদি $ s = "" থাকে তবে $ s [0] একটি "নোটিশ: অবিস্মরণীয় স্ট্রিং অফসেট: 0" উত্পন্ন করবে যেখানে সাবস্ট্রাস্ট ($ গুলি, 0, 1) করবে না।
ক্রিস

46

}} সিনট্যাক্সটি পিএইচপি 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].
ভলকারক

4
@ ভোলকারক: আপনি যে লিঙ্কটি দিয়েছেন তা আমি লক্ষ্য করেছি যে তারা কেবলমাত্র পিএইচপি ম্যানুয়ালটিতে থাকা নোটটি সরিয়ে ফেলেছে: Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.তাই আমি ভাবছি যে তারা সিদ্ধান্ত নিয়েছে যে {}পিএইচপি 6
মার্কো ডেমাইও

1
@ মার্কোডেমিও লিঙ্কটি এখন মাইকেলমার্টন যা বলেছে তা জানায়।
টিনো

1
"হ্রাসের কোনও ইঙ্গিত দেয় না" - প্রকৃতপক্ষে, অবমূল্যায়ন বার্তাটি 304518 - সংশোধনীতে সরিয়ে ফেলা হয়েছে - 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/tyype/…
ভলকারক

আজ (10 মে'18), পছন্দ হওয়া পিএইচপি ডক্সের একটি উদ্ধৃতি : Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. মনে হচ্ছে এই সিনট্যাক্সটি কিছু সময়ের জন্য থাকবে stay
ফ্র0zenFyr

25

বলুন আপনি char _POST এর একটি অংশ থেকে প্রথম চরটি চান, এটি 'টাইপ' বলতে দিন। এবং সেই _P _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

আমার একমাত্র সন্দেহটি হবে এই কৌশলটি মাল্টি-বাইট স্ট্রিংগুলিতে কতটা প্রযোজ্য হবে, তবে যদি এটি বিবেচনা না করা হয় তবে আমি সন্দেহ করি যে আপনি coveredেকে রেখেছেন। (যদি সন্দেহ হয় তবে mb_substr()স্পষ্টতই নিরাপদ পছন্দ বলে মনে হচ্ছে))

যাইহোক, একটি বড় চিত্রের দৃষ্টিকোণ থেকে, আমি ভাবতে পারি যে আপনাকে কীভাবে বিবেচনা করতে পারে তার জন্য আপনাকে কতবার স্ট্রিংয়ের 'এন' চরিত্রটি অ্যাক্সেস করতে হবে।


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.9647579193115E-7 "অ্যারে {}" ব্যবহার করে গড় ফ্লোট মাইক্রোটাইম হয় 2.1522283554077E-7
এলার্ট ভ্যান কোপেরেন

সঠিক পরিমাপের জন্য, আপনাকে লুপটি থেকে আরও ভালভাবে মাইক্রোটাইম করা উচিত এবং একই লুপের মধ্যে বিভিন্ন পদ্ধতির মিশ্রণ করা উচিত নয়।
পাইপব্রোস 4'16

1
একই লুপগুলির মধ্যে testAএবং এর সাথে কার্যকরকরণের মিশ্রণ না testBকরার অর্থ আপনি সনাক্ত করতে সক্ষম হন যেমন ক্যাশে-বান্ধব testBথাকাকালীন ক্যাশে-হত্যাকারী fact testAযখন তারা উভয় একই লুপে থাকে, তখন তাদের একই সময়সীমার সাথে পরিমাপ করা হয় কারণ testBদূষিতের testAক্যাচিং।
পাইপব্রোস

1
একইভাবে, আমি টেস্টিং লুপগুলির মধ্যে স্ট্রিং বা এলোমেলো উত্পাদন এড়াতে চাইতাম এবং সেগুলি কাছাকাছি একটি অ্যারেতে প্রস্তুত করতাম।
পাইপব্রস

1
-1; প্রশ্নবিদ্ধ সময় ব্যবস্থাকে একপাশে রেখে (এক সাথে একবার সময় দেওয়ার চেয়ে অনেক কাজ করা ভাল হবে; এটি পড়ে আমি চিন্তিত হয়েছি যে microtime()কল করার সময় নেওয়া বেশিরভাগ সময়ের পার্থক্য তৈরি করবে, যদিও পরীক্ষামূলকভাবে মনে হয় সত্য হতে না পারে), এখানে ছোট গতির পার্থক্য সম্পর্কে যত্ন নেওয়ার কোনও কারণ নেই। এটি এক সেকেন্ডের মিলিয়ন ভাগের এক ভগ্নাংশ; এই হয় কি ব্যাপার যাচ্ছ?
মার্ক আমেরিকা

6

নিছক নশ্বর হিসাবে কথা বলতে বলতে আমি আটকে থাকতাম $str[0]। যতদূর আমি উদ্বিগ্ন, এর $str[0]চেয়ে এক নজরে অর্থ বোঝা আরও দ্রুত substr($str, 0, 1)। এটি সম্ভবত পছন্দসই বিষয়টিতে ফোটে।

পারফরম্যান্স যতদূর যায়, ওয়েল, প্রোফাইল প্রোফাইল। :) অথবা আপনি পিএইচপি উত্স কোডটিতে তল্লাশী করতে পারেন ...


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

6
-1; ও.পি. এর প্রশ্ন ছিল যে এই বাক্য গঠনটি একটি খারাপ অভ্যাস ছিল এবং আপনি প্রতিক্রিয়া জানিয়েছিলেন ... কোনও মন্তব্য ছাড়াই সিনট্যাক্সটি পুনরাবৃত্তি করছেন? এটি কোনও উত্তর নয়।
মার্ক আমেরিকা

5

মাল্টিবাইট (ইউনিকোড) স্ট্রিং ব্যবহারের ক্ষেত্রে str[0]সমস্যা সৃষ্টি করতে পারে। mb_substr()একটি ভাল সমাধান। উদাহরণ স্বরূপ:

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

কিছু বিশদ এখানে: ইউটিএফ -8 স্ট্রিংয়ের প্রথম চরিত্রটি পান


এই সমাধানের জন্য আপনাকে ধন্যবাদ! যদি প্রথম চরিত্রটি ইউনিকোড হয়, []
অযথা

1

আমি এর আগেও সেই স্বরলিপি ব্যবহার করেছি, এর কোনও খারাপ প্রতিক্রিয়া এবং কোনও ভুল বোঝাবুঝি নেই। এটি অর্থবোধ করে - একটি স্ট্রিং সর্বোপরি অক্ষরের একটি অ্যারে।


না, একটি স্ট্রিং অক্ষরের অ্যারে নয় (কমপক্ষে পিএইচপি এই দুটি পদ ব্যবহার করে)। -1।
মার্ক আমেরিকা


অভ্যন্তরীণভাবে @ গ্যাটসট্রব তারা, তবে পিএইচপি যে মডেলটি প্রকাশ করে, তারা মূলত আলাদা জিনিস different স্কয়ার ব্র্যাকেট স্বরলিপি ব্যবহার করে একটি অফসেট অ্যাক্সেস করা কেবলমাত্র অ্যারেগুলির সাথে মিল রয়েছে এমন একমাত্র ক্রিয়াকলাপ; স্ট্রিং ফাংশন অ্যারে, বা ভিসা বিপরীতে কাজ করে না এবং অ্যারে অ্যাপেন্ড সিনট্যাক্স ( $arr[] = $new_element) স্ট্রিংয়ে কাজ করে না। যেমন, আমি মনে করি না চরিত্রের অ্যারে হিসাবে স্ট্রিংগুলি সংরক্ষণ করা দরকারী।
মার্ক আমেরিকা

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