¿Cómo obtener el último carácter de una cadena en PHP?

476

Necesito obtener el último carácter de una cadena. Digamos que tengo "probadores" como cadena de entrada y quiero que el resultado sea "s". ¿Cómo puedo hacer eso en PHP?

desfile de calle
fuente
Puede ser s($str)->end()útil, como se encuentra en esta biblioteca independiente .
graznar

Respuestas:

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

O, para cadenas multibytes:

substr("multibyte string…", -1); // returns "…"
Rich Adams
fuente
114
Si está utilizando codificaciones de caracteres multibyte como UTF-8, use mb_substr( php.net/mb_substr ) en su lugar.
Gumbo
99
tanto para mi substr ($ string, strlen ($ string) -1, 1) ;. Parece que he tomado el camino largo!
Jeffrey
44
Solo necesita funciones de cadena multibyte si la cadena se evalúa como cadena binaria. Aka, cuando php no conoce la codificación. De lo contrario, las funciones de cadena no multibyte típicas funcionarán bien.
Ray Foss
76
substr($string, -1) 
knittl
fuente
70

O por acceso directo a la cadena :

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

Tenga en cuenta que esto no funciona para cadenas multibyte. Si necesita trabajar con una cadena multibyte, considere usar la mb_*familia de funciones de cadena.

A partir de PHP 7.1.0 también se admiten índices numéricos negativos, por ejemplo, solo $string[-1];

Gordon
fuente
2
Me gusta esta respuesta de estilo C, me pregunto por qué esto solo tiene estos pocos votos positivos.
Valentin Mercier
16
@ValentinMercier: Porque esta es una pregunta de PHP, no C.
Martin Thoma
1
Creo que esta es una mejor solución porque le permite modificar el carácter, mientras que la solución substr dada anteriormente no lo hace.
cazort
Tenga en cuenta que esto arrojará un aviso si la cadena está vacía.
Scott Buchanan
40

Desde PHP 7.1 puede hacer esto ( rfc aceptado para compensaciones de cadena negativas ):

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

Te dejaré adivinar la salida.

Además, agregué esto al código de rendimiento de xenonite con estos resultados:

substr () tomó 7.0334868431091 segundos

el acceso a la matriz tomó 2.3111131191254 segundos

El acceso directo a la cadena (compensaciones de cadena negativas) tardó 1.7971360683441 segundos

RyanNerd
fuente
¡Gracias por publicar puntos de referencia! Si alguien está interesado en los puntos de referencia de C # por hacer lo mismo, esta página es una buena lectura. El acceso directo al último personaje ganó.
¿podría explicar más sobre la diferencia entre [] y {} en este contexto?
Taufik Nur Rahmanda
2
@TaufikNurRahmanda Técnicamente no hay diferencia entre [] y {}. Los desarrolladores de PHP dieron la opción de usar cualquiera. Para más detalles ver: php.net/manual/en/migration71.new-features.php
RyanNerd
¿Qué es el acceso a matrices y qué es el acceso directo a cadenas? @RyanNerd afaik esas son 2 mismas cosas, ¿no?
CT.
1
$ string {1} quedará en desuso en PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek
17

No puedo dejar comentarios, pero con respecto a la respuesta de FastTrack, recuerde también que el final de línea puede ser solo un carácter. Yo sugeriría

substr(trim($string), -1)

EDITAR: Mi código a continuación fue editado por alguien, por lo que no hace lo que indiqué. He restaurado mi código original y he cambiado la redacción para que quede más claro.

trim(o rtrim) eliminará todos los espacios en blanco, por lo que si necesita verificar un espacio, una pestaña u otro espacio en blanco, reemplace primero manualmente las diversas terminaciones de línea:

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

A partir de PHP 7.1.0, también se admiten desplazamientos de cadena negativos. Entonces, si te mantienes al día, puedes acceder al último carácter de la cadena de esta manera:

$str[-1]

MANIFESTACIÓN

A pedido de un @mickmackusa, suplemente mi respuesta con posibles formas de aplicación:

<?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
fuente
El uso de compensaciones negativas fue una técnica mencionada años antes por RyanNerd. Publique una respuesta solo cuando tenga ideas únicas y valiosas para compartir.
mickmackusa
@mickmackusa ¿Por qué lo escribiste solo para mí e ignoré las múltiples variaciones substr ()?
nektobit
Nada personal, acabo de ver tu respuesta muy breve y redundante y decidí hacer sonar mi silbato. Siéntase libre de denunciar las otras respuestas si cree que no agregan ningún valor. Tenga en cuenta que dos respuestas pueden sugerir la misma técnica, pero ambas pueden ser valiosas individualmente debido a lo que se explica. Este es un lugar de educación y empoderamiento: agregar ideas únicas a las soluciones ofrecidas anteriormente puede ser bastante valioso para los investigadores.
mickmackusa
Por ejemplo, esta respuesta mía se publicó un mes después de que se publicó la misma técnica. Iba a escribir un comentario debajo de la respuesta anterior, pero a medida que escribía toda la información que quería ofrecer, obviamente era demasiado para comentar con sensatez. Publiqué una nueva respuesta y agregué muchas ideas complementarias e información de antecedentes sobre la técnica e incluí un punto de referencia. Así es como una solución no única puede ser valiosa para los investigadores.
mickmackusa
5

Aconsejaría buscar la solución de Gordon, ya que es más eficiente que 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 algo como

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds
Xenonita
fuente
2
Esto debería ser un comentario sobre la respuesta de Gordon.
Ganso
1
Puede confirmar esto. Cuanto más larga sea su cadena, mayor será la diferencia de rendimiento. En mi prueba con 10 caracteres, la substr es aproximadamente un 20% más lenta
Philipp
No es sorprendente ya que substr () tiene la sobrecarga de una llamada de función y la otra es la manipulación directa de cadenas "C like". Por cierto, ejecuté este código en PHP 7.1-dev con los resultados: substr () tomó 7.090255022049seconds \ array access tomó 2.3145787715912seconds
RyanNerd
4

Recuerde, si tiene una cadena que se leyó como una línea de un archivo de texto usando la fgets()función, debe usarla substr($string, -3, 1)para obtener el carácter real y no parte del CRLF (Avance de línea de retorno de carro).

No creo que la persona que hizo la pregunta lo necesitara, pero para mí, estaba teniendo problemas para obtener el último carácter de una cadena de un archivo de texto, así que estoy seguro de que otros se encontrarán con problemas similares.

Vía rápida
fuente
2

Puede encontrar el último carácter usando php de muchas maneras, como substr () y mb_substr () .

Si está utilizando codificaciones de caracteres multibyte como UTF-8, use mb_substr en lugar de substr

Aquí puedo mostrarles los dos ejemplos:

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

DEMO EN VIVO

Faisal
fuente
1

Una cadena en diferentes lenguajes, incluidos C sharp y PHP, también se considera una serie de caracteres.

Sabiendo que, en teoría, las operaciones de matriz deberían ser más rápidas que las de cadena que podría hacer,

$foo = "bar";


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

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

Sin embargo, las funciones de matriz estándar como

count();

no funcionará en una cadena.

Petar Atanasov
fuente
-3

Siemano, obtenga solo archivos php del directorio seleccionado:

$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 />';
  }
}
ZMORA PROSTO Z KRZOKA
fuente