PHP'de bir dizenin son karakterini nasıl alabilirim?


Yanıtlar:


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

Veya çok baytlı dizeler için:

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

114
UTF-8 gibi çok baytlı karakter kodlamaları kullanıyorsanız, bunun yerine mb_substr( php.net/mb_substr ) öğesini kullanın.
Gumbo

9
substr ($ string, strlen ($ string) -1, 1) için çok fazla; Görünüşe göre UZUN bir yol katettim!
jeffkee

4
Çok amaçlı dize işlevlerine yalnızca dize ikili dize olarak değerlendirilirse ihtiyacınız vardır. Aka, php kodlamayı bilmediğinde. Aksi takdirde tipik çokbaytlı dize işlevleri gayet iyi çalışır.
Ray Foss


70

Veya doğrudan dize erişimi ile :

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

Bunun çok baytlı dizelerde çalışmadığını unutmayın. Çok baytlı dize ile çalışmanız gerekiyorsa, dize işlev ailesini kullanmayı düşünün mb_*.

PHP 7.1.0'dan itibaren negatif sayısal indeksler de desteklenmektedir, örn. $string[-1];


2
Bu C tarzı cevabı beğendim, bunun neden sadece bu kadar az oy aldığını merak ediyorum.
Valentin Mercier

16
@ValentinMercier: Çünkü bu bir PHP sorusu değil, C değil.
Martin Thoma

1
Bu daha iyi bir çözüm olduğunu düşünüyorum çünkü karakteri değiştirmenize izin verirken, yukarıda verilen substr çözümü değiştirmez.
cazort

Dize boşsa, bunun bir bildirim göndereceğini unutmayın.
Scott Buchanan

40

PHP 7.1'den bunu yapabilirsiniz ( Negatif string ofsetleri için kabul edilen rfc ):

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

Çıktıyı tahmin etmenize izin vereceğim.

Ayrıca, bu sonuçlarla xenonite'ın performans koduna ekledim :

substr () 7.0334868431091 saniye aldı

dizi erişimi 2.3111131191254 saniye aldı

Doğrudan dize erişimi (negatif dize ofsetleri) 1.7971360683441 saniye aldı


Kıyaslamalar gönderdiğiniz için teşekkür ederiz! Herkes aynı şeyi yapmak için C # kriterleri ile ilgileniyorsa, bu sayfa iyi bir okuma. Doğrudan son karaktere erişmek kazandı.

bu bağlamda [] ve {} arasındaki fark hakkında daha fazla bilgi verebilir misiniz?
Taufik Nur Rahmanda

2
@TaufikNurRahmanda Teknik olarak [] ve {} arasında bir fark yoktur. PHP geliştiricileri de kullanma seçeneği sunmuşlardır. Daha fazla bilgi için bakınız: php.net/manual/en/migration71.new-features.php
RyanNerd

dizi erişimi nedir ve doğrudan dize erişimi nedir? @RyanNerd afaik bunlar 2 aynı şey, değil mi?
CT.

1
$ string {1} PHP 7.4'te kullanımdan kaldırılacak (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

Yorum bırakamıyorum, ancak FastTrack'ın cevabı ile ilgili olarak, satır sonunun sadece tek bir karakter olabileceğini unutmayın. öneririm

substr(trim($string), -1)

EDIT: Aşağıdaki kod, birileri tarafından düzenlenmiş, bu benim belirttiğim yapmak değil. Orijinal kodumu geri yükledim ve daha açık hale getirmek için ifadeleri değiştirdim.

trim(veya rtrim) tüm boşlukları kaldıracaktır , bu nedenle boşluk, sekme veya diğer boşlukları kontrol etmeniz gerekiyorsa, önce çeşitli satır sonlarını manuel olarak değiştirin:

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

12

PHP 7.1.0'dan itibaren, negatif dize ofsetleri de desteklenmektedir. Böylece, zamana ayak uydurursanız, dizedeki son karaktere şu şekilde erişebilirsiniz:

$str[-1]

DEMO

Bir mickmackusa'nın talebi üzerine, cevabımı olası başvuru yollarıyla destekliyorum:

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

Negatif ofset kullanımı, yıllar önce RyanNerd tarafından bahsedilen bir teknikti. Lütfen yalnızca paylaşabileceğiniz benzersiz ve değerli bilgiler olduğunda bir yanıt gönderin.
mickmackusa

@mickmackusa Neden sadece bana yazdınız ve substr () çoklu varyasyonlarını dikkate almadınız?
nektobit

Kişisel bir şey yok, çok kısa ve gereksiz cevabını gördüm ve düdüğümü çalmaya karar verdim. Herhangi bir değer katmadığını düşünüyorsanız, diğer cevapları ıslık çalmaktan çekinmeyin. Unutmayın, iki cevap aynı tekniği önerebilir, ancak açıklandığı için her ikisi de bireysel olarak değerli olabilir. Burası bir eğitim ve güçlendirme yeridir - daha önce sunulan çözümlere benzersiz bilgiler eklemek araştırmacılar için oldukça değerli olabilir.
mickmackusa

Örneğin, bu cevabım aynı tekniğin yayınlanmasından bir ay sonra yayınlandı. Önceki cevabın altında bir yorum yazacaktım, ama sunmak istediğim tüm bilgileri yazdığımda, açıkça yorum yapmak çok açıktı. Yeni bir yanıt gönderdim ve tekniğe ilişkin birçok ücretsiz öngörü ve arka plan bilgisi ekledim ve bir karşılaştırma ölçütü ekledim. Benzersiz olmayan bir çözüm bu şekilde araştırmacılar için değerli olabilir.
mickmackusa

5

Substr () 'den daha performanslı olduğu için Gordon'un çözümüne gitmenizi tavsiye ederim:

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

gibi bir şey çıktılar

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Bu Gordon'un cevabı hakkında bir yorum olmalı.
Kaz

1
Bunu onaylayabilir. Dizeniz ne kadar uzun olursa, performans farkı o kadar büyük olur. 10 karakterlik substr ile yaptığım testte yaklaşık% 20 daha yavaş
Philipp

Substr () işlev çağrısının ek yüküne sahip olduğu ve diğerinin "C like" doğrudan dize manipülasyonu olduğu için şaşırtıcı değildir. BTW Ben bu kodu PHP 7.1-dev üzerinde sonuçları ile çalıştırdı: substr () aldı 7.090255022049seconds \ array erişim aldı 2.3145787715912seconds
RyanNerd

4

Unutmayın, fgets()işlevi kullanarak bir metin dosyasından satır olarak okunan bir substr($string, -3, 1)dizeniz varsa, CRLF'nin (Satır Başı Satır Beslemesi) bir parçası değil, gerçek karakteri elde etmek için kullanmanız gerekir .

Soruyu soran kişinin buna ihtiyacı olduğunu sanmıyorum, ama benim için, bir metin dosyasından bir dizeden son karakteri almakta sorun yaşıyordum, bu yüzden başkalarının benzer sorunlarla karşılaşacağından eminim.


2

Son karakteri php kullanarak substr () ve mb_substr () gibi birçok yolla bulabilirsiniz .

UTF-8 gibi çok baytlı karakter kodlamaları kullanıyorsanız , substr yerine mb_substr kullanın

Burada her iki örneği de gösterebilirim:

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

CANLI DEMO


1

C sharp ve PHP gibi farklı dillerde bir dize de bir dizi karakter olarak kabul edilir.

Teorik dizi işlemlerinin yapabileceğiniz string işlemlerinden daha hızlı olması gerektiğini bilerek,

$foo = "bar";


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

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

Ancak, standart dizi işlevleri

count();

bir dize üzerinde çalışmaz.


-3

Siemano, sadece seçilen dizinden php dosyaları alın:

$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 />';
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.