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


Respuestas:


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

O, para cadenas multibytes:

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

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


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];


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


¡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);

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)

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

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.


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


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.


-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 />';
  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.