Come ottenere l'ultimo carattere di una stringa in PHP?


Risposte:


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

Oppure, per le stringhe multibyte:

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

114
Se si utilizzano codifiche di caratteri multibyte come UTF-8, utilizzare invece mb_substr( php.net/mb_substr ).
Gumbo,

9
così tanto per il mio substr ($ string, strlen ($ string) -1, 1) ;. Sembra che io abbia preso la strada LUNGA!
jeffkee,

4
Sono necessarie funzioni stringa multibyte solo se la stringa viene valutata come stringa binaria. Ah, quando php non conosce la codifica. Altrimenti le tipiche funzioni di stringa non multibyte funzioneranno bene.
Ray Foss


70

O tramite accesso diretto alla stringa :

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

Si noti che questo non funziona per le stringhe multibyte. Se devi lavorare con una stringa multibyte, prendi in considerazione l'uso della mb_*famiglia di funzioni stringa.

A partire da PHP 7.1.0 sono supportati anche indici numerici negativi, ad esempio solo $string[-1];


2
Mi piace questa risposta in stile C, mi chiedo perché questo abbia solo questi pochi voti.
Valentin Mercier,

16
@ValentinMercier: Perché questa è una domanda PHP, non C.
Martin Thoma,

1
Penso che questa sia una soluzione migliore perché ti permette di modificare il personaggio, mentre la soluzione substr fornita sopra non lo fa.
cazort,

Si noti che ciò genererà un avviso se la stringa è vuota.
Scott Buchanan,

40

Da PHP 7.1 puoi farlo ( rfc accettato per offset di stringhe negative ):

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

Ti faccio indovinare l'output.

Inoltre, ho aggiunto questo al codice delle prestazioni di xenonite con questi risultati:

substr () ha impiegato 7.0334868431091 secondi

l'accesso alla matrice ha richiesto 2.3111131191254 secondi

L'accesso diretto alla stringa (offset di stringa negativo) ha richiesto 1.7971360683441 secondi


Grazie per aver pubblicato benchmark! Se qualcuno è interessato ai benchmark C # per fare la stessa cosa, questa pagina è una buona lettura. Accesso diretto all'ultimo personaggio vinto.

potresti spiegare di più sulla differenza tra [] e {} in questo contesto?
Taufik Nur Rahmanda,

2
@TaufikNurRahmanda Tecnicamente non c'è differenza tra [] e {}. Gli sviluppatori di PHP hanno dato la possibilità di utilizzare entrambi. Per maggiori dettagli si veda: php.net/manual/en/migration71.new-features.php
RyanNerd

cos'è l'accesso all'array e cos'è l'accesso diretto alla stringa? @RyanNerd afaik quelle sono 2 stesse cose, no?
CT.

1
$ string {1} sarà deprecato in PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

Non posso lasciare commenti, ma per quanto riguarda la risposta di FastTrack, ricordo anche che la fine della riga può essere solo di un singolo carattere. suggerirei

substr(trim($string), -1)

EDIT: Il mio codice di seguito è stato modificato da qualcuno, facendo in modo che non facesse ciò che avevo indicato. Ho ripristinato il mio codice originale e modificato il testo per renderlo più chiaro.

trim(o rtrim) rimuoverà tutti gli spazi bianchi, quindi se è necessario controllare uno spazio, una scheda o un altro spazio bianco, sostituire prima manualmente le varie terminazioni di riga:

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

12

A partire da PHP 7.1.0, sono supportati anche offset di stringa negativi. Quindi, se stai al passo con i tempi, puoi accedere all'ultimo carattere della stringa in questo modo:

$str[-1]

DEMO

Su richiesta di un @mickmackusa, integra la mia risposta con possibili modi di applicazione:

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

L'uso di offset negativi era una tecnica menzionata anni prima da RyanNerd. Pubblica una risposta solo quando hai approfondimenti unici e preziosi da condividere.
Mickmackusa,

@mickmackusa Perché l'hai scritto solo per me e hai ignorato le variazioni multiple substr ()?
Nektobit il

Niente di personale, ho appena visto la tua risposta molto breve e ridondante e ho deciso di emettere il mio fischio. Sentiti libero di denunciare le altre risposte se ritieni che non abbiano valore. Tieni presente che due risposte possono suggerire la stessa tecnica ma entrambe hanno un valore individuale a causa di ciò che viene spiegato. Questo è un luogo di educazione e responsabilizzazione: l'aggiunta di approfondimenti unici alle soluzioni precedentemente offerte può essere molto utile per i ricercatori.
Mickmackusa,

Ad esempio, questa mia risposta è stata pubblicata un mese dopo la pubblicazione della stessa tecnica. Stavo per scrivere un commento sotto la risposta precedente, ma mentre scrivevo tutte le informazioni che volevo offrire, era ovviamente troppo per commentare sensatamente. Ho pubblicato una nuova risposta e aggiunto molte informazioni dettagliate e informazioni di base sulla tecnica e incluso un benchmark. Ecco come una soluzione non unica può essere preziosa per i ricercatori.
Mickmackusa,

5

Consiglio di optare per la soluzione di Gordon in quanto è più performante di substr ():

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

produce qualcosa di simile

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Questo dovrebbe essere un commento sulla risposta di Gordon.
Oca,

1
Posso confermare questo. Più lunga è la stringa, maggiore è la differenza di prestazioni. Nel mio test con 10 caratteri il substr è circa il 20% più lento
Philipp

Non sorprende poiché substr () ha il sovraccarico di una chiamata di funzione e l'altro è la manipolazione diretta della stringa "C like". A proposito ho eseguito questo codice su PHP 7.1-dev con i risultati: substr () ha impiegato 7.090255022049secondi \ accesso all'array ha richiesto 2.3145787715912secondi
RyanNerd

4

Ricorda, se hai una stringa che è stata letta come una riga da un file di testo usando la fgets()funzione, devi usarla in substr($string, -3, 1)modo da ottenere il carattere effettivo e non parte del CRLF (avanzamento riga di ritorno a capo).

Non penso che la persona che ha posto la domanda abbia bisogno di questo, ma per me ho avuto problemi a ottenere l'ultimo carattere da una stringa da un file di testo, quindi sono sicuro che altri incontreranno problemi simili.


2

Puoi trovare l'ultimo carattere usando php in molti modi come substr () e mb_substr () .

Se si utilizzano codifiche di caratteri multibyte come UTF-8, utilizzare mb_substr invece di substr

Qui posso mostrarvi entrambi gli esempi:

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

DIMOSTRAZIONE DAL VIVO


1

Una stringa in diverse lingue tra cui C sharp e PHP è anche considerata una matrice di caratteri.

Sapendo che in teoria le operazioni di array dovrebbero essere più veloci di quelle di stringa che potresti fare,

$foo = "bar";


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

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

Tuttavia, funzioni di array standard come

count();

non funzionerà su una stringa.


-3

Siemano, ottieni solo file php dalla directory selezionata:

$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 />';
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.