PHP में एक स्ट्रिंग के अंतिम चार कैसे प्राप्त करें?


476

मुझे एक स्ट्रिंग का अंतिम चरित्र प्राप्त करने की आवश्यकता है। कहते हैं कि मेरे पास इनपुट स्ट्रिंग के रूप में "परीक्षक" हैं और मैं चाहता हूं कि परिणाम "s" हो। मैं PHP में कैसे कर सकता हूँ?


आपको s($str)->end()मदद मिल सकती है , जैसा कि इस स्टैंडअलोन लाइब्रेरी में पाया गया है ।
caw

जवाबों:


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

या, मल्टीबाइट्स स्ट्रिंग्स के लिए:

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

114
आप UTF-8, उपयोग की तरह multibyte वर्ण एन्कोडिंग उपयोग कर रहे हैं mb_substr( php.net/mb_substr ) के बजाय।
गुमबो

9
मेरे पदार्थ के लिए इतना ($ स्ट्रिंग, स्ट्रलेन ($ स्ट्रिंग) -1, 1);) लगता है मैं चारों ओर लंबा रास्ता ले लिया है!
जेफकी

4
यदि स्ट्रिंग को बाइनरी स्ट्रिंग के रूप में मूल्यांकन किया जाता है, तो आपको केवल मल्टीबाइट स्ट्रिंग फ़ंक्शन की आवश्यकता होती है। उर्फ, जब php एन्कोडिंग नहीं जानता है। अन्यथा विशिष्ट गैर मल्टीबाइट स्ट्रिंग फ़ंक्शन ठीक काम करेंगे।
रे फॉस


70

या डायरेक्ट स्ट्रिंग एक्सेस द्वारा :

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

ध्यान दें कि यह मल्टीबाइट स्ट्रिंग्स के लिए काम नहीं करता है। यदि आपको मल्टीबाइट स्ट्रिंग के साथ काम करने की आवश्यकता है, तो फ़ंक्शन के स्ट्रिंग परिवार का उपयोग करने पर विचार करें mb_*

PHP के रूप में 7.1.0 नकारात्मक संख्यात्मक सूचकांक भी समर्थित हैं, उदाहरण के लिए $string[-1];


2
मुझे यह सी शैली जवाब पसंद है, मुझे आश्चर्य है कि यह केवल इस कुछ उत्थान को क्यों मिला है।
वैलेंटाइन मर्सियर

16
@ वेलेंटिनमेरिसर: क्योंकि यह एक पीएचपी प्रश्न है, सी। नहीं
मार्टिन थोमा

1
मुझे लगता है कि यह एक बेहतर समाधान है क्योंकि यह आपको चरित्र को संशोधित करने की अनुमति देता है, जबकि ऊपर दिया गया मूल समाधान नहीं करता है।
1916 को cazort

ध्यान दें कि यह एक नोटिस फेंक देगा यदि स्ट्रिंग खाली है।
स्कॉट बुकानन

40

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

मैं आपको आउटपुट का अनुमान लगाता हूँ।

इसके अलावा, मैंने इन परिणामों के साथ इसे xenonite के प्रदर्शन कोड में जोड़ा :

पदार्थ () में 7.0334868431091 सेकेंड लिया गया

सरणी का उपयोग 2.3111131191254 वर्ग सेकंड में हुआ

डायरेक्ट स्ट्रिंग ऐक्सेस (निगेटिव स्ट्रिंग ऑफसेट) ने 1.7971360683441 सेकेंड लिया


बेंचमार्क पोस्ट करने के लिए धन्यवाद! यदि किसी को समान कार्य करने के लिए C # मानदंड में रुचि है, तो यह पृष्ठ एक अच्छा पढ़ा गया है। सीधे अंतिम चरित्र तक पहुँचने के लिए जीत हासिल की।

क्या आप इस संदर्भ में [] और {} के बीच अंतर के बारे में अधिक बता सकते हैं?
तौफीक नूर रहमानंद

2
@TaufikNurRahmanda तकनीकी रूप से [] और {} के बीच कोई अंतर नहीं है। PHP डेवलपर्स ने या तो उपयोग करने का विकल्प दिया। अधिक जानकारी के लिए देखें: php.net/manual/en/migration71.new-features.php
रयाननर्ड

ऐरे एक्सेस क्या है और डायरेक्ट स्ट्रिंग एक्सेस क्या है? @RyanNerd afaik वो 2 समान चीजें हैं, नहीं?
सीटी।

1
$ स्ट्रिंग {1} को PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
टोनी

17

मैं टिप्पणी नहीं छोड़ सकता, लेकिन फास्टट्रैक के उत्तर के संबंध में, यह भी याद रखें कि समाप्त होने वाली लाइन केवल एकल वर्ण हो सकती है। मै सुझाव दूंगा

substr(trim($string), -1)

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

trim(या rtrim) सभी व्हाट्सएप को हटा देगा , इसलिए यदि आपको किसी स्थान, टैब या अन्य व्हाट्सएप की जांच करने की आवश्यकता है, तो पहले विभिन्न लाइन एंडिंग्स को मैन्युअल रूप से बदलें:

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

12

PHP 7.1.0 के रूप में, नकारात्मक स्ट्रिंग ऑफ़सेट भी समर्थित हैं। इसलिए, यदि आप समय के साथ रहते हैं, तो आप इस तरह से स्ट्रिंग में अंतिम वर्ण तक पहुँच सकते हैं:

$str[-1]

डेमो

एक @mickmackusa के अनुरोध पर, मैं आवेदन के संभावित तरीकों के साथ अपना उत्तर देता हूं:

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

नेगेटिव ऑफसेट का उपयोग करना रयानएनर्ड द्वारा वर्षों पहले उल्लेखित तकनीक थी। कृपया जवाब तभी पोस्ट करें जब आपके पास साझा करने के लिए अद्वितीय और मूल्यवान अंतर्दृष्टि हो।
मिकमैकुसा

@mickmackusa आपने इसे केवल मेरे लिए क्यों लिखा और कई विविधताओं को अनदेखा किया?
नेकटोबिट

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

उदाहरण के लिए, मेरा यह जवाब उसी तकनीक को पोस्ट करने के एक महीने बाद पोस्ट किया गया था। मैं पहले वाले उत्तर के तहत एक टिप्पणी लिखने जा रहा था, लेकिन जैसा कि मैंने उन सभी सूचनाओं को टाइप किया, जिन्हें मैं प्रस्तुत करना चाहता था, यह स्पष्ट रूप से बहुत ही समझदार टिप्पणी थी। मैंने एक नया उत्तर पोस्ट किया और तकनीक के बारे में बहुत सारी मानार्थ अंतर्दृष्टि और पृष्ठभूमि जानकारी जोड़ी और एक बेंचमार्क शामिल किया। यह एक गैर-अनूठा समाधान है जो शोधकर्ताओं के लिए मूल्यवान हो सकता है।
मिकमैकुसा

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% धीमा है
फिलिप 21

नहीं के रूप में आश्चर्य की बात () एक समारोह कॉल के उपरि है और दूसरे "सी की तरह" सीधे स्ट्रिंग हेरफेर है। BTW I ने परिणामों के साथ PHP 7.1-dev पर इस कोड को चलाया: रूट () में 7.090255022049seconds \ array एक्सेस लिया, 2.3145787715912seconds लिया
RyanNerd

4

याद रखें, यदि आपके पास एक स्ट्रिंग है जिसे पाठ फ़ाइल से एक पंक्ति के रूप में पढ़ा गया था जिसका उपयोग किया गया था fgets() फ़ंक्शन उपयोग करने की आवश्यकता है substr($string, -3, 1)ताकि आपको वास्तविक वर्ण मिल जाए और CRLF (कैरिज रिटर्न लाइन फीड) का हिस्सा न हो।

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


2

आप मूल () और mb_substr () जैसे कई तरीकों से php का उपयोग करके अंतिम वर्ण पा सकते हैं ।

आप UTF-8 की तरह multibyte वर्ण एन्कोडिंग का उपयोग कर रहे हैं, का उपयोग mb_substr के बजाय substr

यहाँ मैं आपको दोनों उदाहरण दिखा सकता हूँ:

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

लाइव डेमो


1

सी तेज और PHP सहित विभिन्न भाषाओं में एक स्ट्रिंग भी वर्णों की एक सरणी माना जाता है।

यह जानकर कि थ्योरी में ऑपरेशन स्ट्रिंग से ज्यादा तेज होने चाहिए जो आप कर सकते हैं,

$foo = "bar";


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

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

हालाँकि, मानक सरणी फ़ंक्शंस जैसे

count();

एक तार पर काम नहीं करेगा।


-3

सिमेंटो, चयनित निर्देशिका से केवल php फाइलें प्राप्त करें:

$dir    = '/home/zetdoa/ftp/domeny/MY_DOMAIN/projekty/project';
$files = scandir($dir, 1);


foreach($files as $file){
  $n = substr($file, -3);
  if($n == 'php'){
    echo $file.'<br />';
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.