কিভাবে পিএইচপি মধ্যে একটি স্ট্রিং এর শেষ চর পেতে?


476

আমার একটি স্ট্রিংয়ের শেষ চরিত্রটি পাওয়া উচিত। বলুন আমার কাছে ইনপুট স্ট্রিং হিসাবে "পরীক্ষক" আছে এবং আমি ফলাফলটি "গুলি" হতে চাই। আমি কীভাবে পিএইচপি করতে পারি?


এই স্ট্যান্ডলোন লাইব্রেরিতেs($str)->end() যেমন পাওয়া যায় আপনি তেমন সহায়ক হতে পারেন ।
কাওয়

উত্তর:


993
substr("testers", -1); // returns "s"

বা, মাল্টিবাইটস স্ট্রিংয়ের জন্য:

substr("multibyte string…", -1); // returns "…"

114
আপনি যদি ইউটিএফ -8 এর মতো মাল্টিবাইট অক্ষর এনকোডিংগুলি ব্যবহার করছেন তবে পরিবর্তে mb_substr( php.net/mb_substr ) ব্যবহার করুন।
গম্বো

9
আমার সাবস্ট্রটারের জন্য এত কিছু ($ স্ট্রিং, স্ট্রেলেন ($ স্ট্রিং) -1, 1);। মনে হচ্ছে আমি দীর্ঘ পথ ঘুরেছি!
জেফকি

4
স্ট্রিংটিকে বাইনারি স্ট্রিং হিসাবে মূল্যায়ন করা হলে আপনার কেবল মাল্টিবাইট স্ট্রিং ফাংশন প্রয়োজন। আক্কা, যখন পিএইচপি এনকোডিং জানেন না। অন্যথায় টিপিকাল নন মাল্টবাইট স্ট্রিং ফাংশনগুলি ঠিক কাজ করবে।
রায় ফস


70

অথবা সরাসরি স্ট্রিং অ্যাক্সেস দ্বারা :

$string[strlen($string)-1];

নোট করুন যে এটি মাল্টিবাইট স্ট্রিংয়ের জন্য কাজ করে না। যদি আপনার মাল্টিবাইট স্ট্রিংয়ের সাথে কাজ করতে হয় তবে ফাংশনের স্ট্রিং পরিবারটি ব্যবহারের বিষয়টি বিবেচনা করুন mb_*

পিএইচপি 7.1.0 হিসাবে নেতিবাচক সংখ্যা সূচকগুলিও সমর্থিত, যেমন ঠিক $string[-1];


2
আমি এই সি স্টাইলের উত্তরটি পছন্দ করি, আমি অবাক হয়েছি কেন কেন এটি কেবল এই কয়েকটি উপার্জন পেয়েছে।
ভ্যালেন্টিন মার্সিয়ার

16
@ ভ্যালেন্টিনমারসিয়ার: কারণ এটি একটি পিএইচপি প্রশ্ন, সি নয়
মার্টিন থোমা

1
আমি মনে করি এটি একটি আরও ভাল সমাধান কারণ এটি আপনাকে চরিত্রটি সংশোধন করার অনুমতি দেয়, যদিও উপরে দেওয়া সাবস্ট্রোল সমাধানটি দেয় না।
Cazort

নোট করুন স্ট্রিং ফাঁকা থাকলে এটি একটি নোটিশ ফেলে দেবে।
স্কট বুচানান

40

পিএইচপি 7.1 থেকে আপনি এটি করতে পারেন ( নেতিবাচক স্ট্রিং অফসেটের জন্য স্বীকৃত আরএফসি ):

<?php
$silly = 'Mary had a little lamb';
echo $silly[-20];
echo $silly{-6};
echo $silly[-3];
echo $silly[-15];
echo $silly[-13];
echo $silly[-1];
echo $silly[-4];
echo $silly{-10};
echo $silly[-4];
echo $silly[-8];
echo $silly{3}; // <-- this will be deprecated in PHP 7.4
die();

আমি আপনাকে আউটপুট অনুমান করতে দেব।

এছাড়াও, আমি এই ফলাফলগুলির সাথে এটি জেনোনাইটের পারফরম্যান্স কোডে যুক্ত করেছি:

সাবস্ট্রাস্ট () 7.0334868431091 সেকেন্ড নিয়েছিল

অ্যারে অ্যাক্সেস 2.3111131191254 সেকেন্ড নিয়েছে

ডাইরেক্ট স্ট্রিং অ্যাক্সেস (নেতিবাচক স্ট্রিং অফসেটস) গ্রহণ করেছে 1.7971360683441 সেকেন্ড


মানদণ্ড পোস্ট করার জন্য ধন্যবাদ! যদি কেউ একই জিনিস করার জন্য সি # বেঞ্চমার্কে আগ্রহী হন তবে এই পৃষ্ঠাটি ভাল পঠিত। সরাসরি শেষ অক্ষর অ্যাক্সেস জিতেছে।

আপনি এই প্রসঙ্গে [] এবং {between এর মধ্যে পার্থক্য সম্পর্কে আরও ব্যাখ্যা করতে পারেন?
তৌফিক নূর রাহমান্দা

2
@ তাউফিকনুর রহমানহদা প্রযুক্তিগতভাবে [] এবং {between এর মধ্যে কোনও পার্থক্য নেই} পিএইচপি বিকাশকারীরা হয় ব্যবহার করার বিকল্প দিয়েছিল। আরও তথ্যের জন্য দেখুন: php.net/manual/en/migration71.new-features.php
RyanNerd

অ্যারে অ্যাক্সেস কী এবং সরাসরি স্ট্রিং অ্যাক্সেস কী? @ রায়াননার্ড আফিক এগুলি কি একই জিনিস, না?
সিটি


17

আমি মন্তব্য করতে পারি না, তবে ফাস্টট্র্যাকের উত্তর সম্পর্কে, এও মনে রাখবেন যে লাইনটি শেষ হওয়া কেবলমাত্র একক অক্ষর হতে পারে। স হ্র হ

substr(trim($string), -1)

সম্পাদনা: নীচের আমার কোডটি কারও দ্বারা সম্পাদিত হয়েছিল, যা আমি নির্দেশ করে যা তা করে না। আমি আমার মূল কোডটি পুনরুদ্ধার করেছি এবং শব্দটিকে আরও স্পষ্ট করতে পরিবর্তন করেছি।

trim(বা rtrim) সমস্ত সাদা স্থান সরিয়ে ফেলবে , সুতরাং আপনার যদি কোনও স্থান, ট্যাব বা অন্যান্য শ্বেতস্পেস পরীক্ষা করার প্রয়োজন হয় তবে প্রথমে ম্যানুয়ালি বিভিন্ন লাইনের শেষগুলি প্রতিস্থাপন করুন:

$order = array("\r\n", "\n", "\r");
$string = str_replace($order, '', $string);
$lastchar = substr($string, -1);

12

পিএইচপি 7.1.0 হিসাবে, নেতিবাচক স্ট্রিং অফসেটগুলিও সমর্থিত। সুতরাং, যদি আপনি সময়ের সাথে তাল মিলিয়ে থাকেন তবে আপনি স্ট্রিংয়ের শেষ অক্ষরটি এর মধ্যে অ্যাক্সেস করতে পারেন:

$str[-1]

ডেমো

@ মিকম্যাকুসার অনুরোধে আমি আমার উত্তরটি প্রয়োগের সম্ভাব্য উপায়গুলির সাথে পরিপূরক করছি:

<?php

$str='abcdef';
var_dump($str[-2]); // => string(1) "e"

$str[-3]='.';
var_dump($str);     // => string(6) "abc.ef"

var_dump(isset($str[-4]));  // => bool(true)

var_dump(isset($str[-10])); // => bool(false)

নেতিবাচক অফসেট ব্যবহার করা বছরখানেক আগে রায়াননার্ড দ্বারা উল্লিখিত একটি কৌশল ছিল। আপনার ভাগ করার অনন্য এবং মূল্যবান অন্তর্দৃষ্টি কেবল তখনই একটি উত্তর পোস্ট করুন।
মিকম্যাকুসা

@ মিকম্যাকুসা আপনি কেন কেবল আমার কাছে এটি লিখেছিলেন এবং একাধিক ভিন্নতা সাবস্ট্রি () উপেক্ষা করেছেন?
nektobit

ব্যক্তিগত কিছুই নয়, আমি আপনার খুব সংক্ষিপ্ত এবং অপ্রয়োজনীয় উত্তরটি দেখেছি এবং আমার বাঁশিটি ফুঁকানোর সিদ্ধান্ত নিয়েছি। আপনি যদি মনে করেন যে সেগুলির কোনও মূল্য নেই। মনে রাখবেন, দুটি উত্তর একই কৌশলটির পরামর্শ দিতে পারে তবে যা ব্যাখ্যা করা হয়েছে তার কারণে উভয়ই স্বতন্ত্রভাবে মূল্যবান হতে পারে। এটি শিক্ষা এবং ক্ষমতায়নের একটি জায়গা - পূর্বে প্রস্তাবিত সমাধানগুলিতে অনন্য অন্তর্দৃষ্টি যুক্ত করা গবেষকদের পক্ষে যথেষ্ট মূল্যবান হতে পারে।
মিকম্যাকুসা

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

5

আমি গর্ডনের সমাধানের জন্য পরামর্শ দেওয়ার পরামর্শ দেব কারণ এটি সাবস্ট্রাস্ট () এর চেয়ে বেশি পারফরম্যান্ট:

<?php 

$string = 'abcdef';
$repetitions = 10000000;

echo "\n\n";
echo "----------------------------------\n";
echo $repetitions . " repetitions...\n";
echo "----------------------------------\n";
echo "\n\n";

$start = microtime(true);
for($i=0; $i<$repetitions; $i++)
    $x = substr($string, -1);

echo "substr() took " . (microtime(true) - $start) . "seconds\n";

$start = microtime(true);
for($i=0; $i<$repetitions; $i++)
    $x = $string[strlen($string)-1];

echo "array access took " . (microtime(true) - $start) . "seconds\n";

die();

ফলাফল কিছু

 ---------------------------------- 
 10000000 repetitions...
 ----------------------------------

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
এটি গর্ডনের উত্তরের মন্তব্য হওয়া উচিত।
গুজ

1
এটি নিশ্চিত করতে পারে। আপনার স্ট্রিংটি দীর্ঘতর, পারফরম্যান্স পার্থক্য। আমার পরীক্ষায় 10 টি অক্ষর সহ সাবস্ট্রাস্ট প্রায় 20% ধীর
ফিলিপ

অবাক হওয়ার মতো বিষয় নয় কারণ সাবস্ট্রিট () এর একটি ফাংশন কলের ওভারহেড রয়েছে এবং অন্যটি হ'ল "সি লাইক" সরাসরি স্ট্রিং ম্যানিপুলেশন। বিটিডাব্লু আমি এই কোডটি পিএইচপি 7.1-dev এ ফলাফল সহ চালিয়েছি: সাবস্ট্রাস্ট () 7.090255022049 সেকেন্ড নিয়েছে ray অ্যারে অ্যাক্সেস গ্রহণ করেছে 2.3145787715912 সেকেন্ডস
রায়াননার্ড

4

মনে রাখবেন, আপনার যদি একটি স্ট্রিং থাকে যা fgets()ফাংশনটি ব্যবহার করে কোনও পাঠ্য ফাইল থেকে একটি লাইন হিসাবে পড়া হয়েছিল , আপনাকে এমন ব্যবহার করা দরকার substr($string, -3, 1)যাতে আপনি আসল চরিত্রটি পান এবং সিআরএলএফ (ক্যারিজ রিটার্ন লাইন ফিড) এর অংশ না পেয়ে।

আমি মনে করি না যে প্রশ্নটি জিজ্ঞাসা করেছেন সেটির এটি প্রয়োজন, তবে আমার জন্য, আমি একটি শেষ পাঠ্য ফাইল থেকে স্ট্রিং থেকে শেষ চরিত্রটি পেতে সমস্যা হচ্ছিলাম যাতে আমি নিশ্চিত যে অন্যরাও একইরকম সমস্যার মুখোমুখি হবে।


2

আপনি সাবস্ট্রাস্টার () এবং এমবি_সুবস্ট্র () এর অনেক উপায়ে পিএইচপি ব্যবহার করে শেষ চরিত্রটি খুঁজে পেতে পারেন ।

আপনি যদি ইউটিএফ -8 এর মতো মাল্টিবাইট চরিত্রের এনকোডিংগুলি ব্যবহার করছেন তবে এর পরিবর্তে mb_substr ব্যবহার করুন substr

এখানে আমি আপনাকে দুটি উদাহরণই দেখাতে পারি:

<?php
    echo substr("testers", -1);
    echo mb_substr("testers", -1);
?>

সরাসরি নমুনা


1

সি শার্প এবং পিএইচপি সহ বিভিন্ন ভাষায় একটি স্ট্রিংকেও অক্ষরের অ্যারে হিসাবে বিবেচনা করা হয়।

তাত্ত্বিকভাবে অ্যারে ক্রিয়াকলাপগুলি আপনি যে স্ট্রিংগুলি করতে পারেন তার চেয়ে দ্রুত হওয়া উচিত তা জেনেও,

$foo = "bar";


$lastChar = strlen($foo) -1;
echo $foo[$lastChar];

$firstChar = 0;
echo $foo[$firstChar];

তবে স্ট্যান্ডার্ড অ্যারে ফাংশনগুলি পছন্দ করে

count();

একটি স্ট্রিং উপর কাজ করবে না।


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