Como obter o último caractere de uma string em PHP?


Respostas:


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

Ou, para cadeias multibytes:

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

114
Se você estiver usando codificações de caracteres multibyte como UTF-8, use mb_substr( php.net/mb_substr ).
Gumbo #

9
muito pelo meu substr ($ string, strlen ($ string) -1, 1) ;. Parece que tomei o LONGO caminho!
jeffkee

4
Você só precisa de funções de sequência multibyte se a sequência for avaliada como sequência binária. Aka, quando o php não conhece a codificação. Caso contrário, as funções típicas de seqüência de caracteres não multibyte funcionarão perfeitamente.
Raio Foss


70

Ou pelo acesso direto à string :

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

Observe que isso não funciona para cadeias multibyte. Se você precisar trabalhar com cadeias multibyte, considere usar a mb_*família de funções string.

No PHP 7.1.0, também são suportados índices numéricos negativos, por exemplo, apenas $string[-1];


2
Eu gosto dessa resposta no estilo C, e me pergunto por que isso só conseguiu alguns votos positivos.
Valentin Mercier

16
@ValentinMercier: Uma vez que esta é uma questão de PHP, não C.
Martin Thoma

1
Eu acho que essa é uma solução melhor porque permite modificar o caractere, enquanto a solução substr fornecida acima não.
precisa saber é o seguinte

Observe que isso emitirá um aviso se a string estiver vazia.
Scott Buchanan

40

No PHP 7.1, você pode fazer isso ( rfc aceito para deslocamentos negativos de string ):

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

Vou deixar você adivinhar a saída.

Além disso, adicionei isso ao código de desempenho do xenonite com estes resultados:

substr () levou 7.0334868431091seconds

o acesso à matriz levou 2,3111131191254segundos

O acesso direto a cadeias (deslocamentos negativos de cadeias) levou 1.7971360683441 segundos


Obrigado por publicar referências! Se alguém estiver interessado nos benchmarks de C # para fazer a mesma coisa, esta página é uma boa leitura. Acessando diretamente o último personagem vencido.

você poderia explicar mais sobre a diferença entre [] e {} nesse contexto?
Taufik Nur Rahmanda

2
@TaufikNurRahmanda Tecnicamente, não há diferença entre [] e {}. Os desenvolvedores do PHP deram a opção de usar qualquer um. Para obter mais detalhes, consulte: php.net/manual/en/migration71.new-features.php
RyanNerd

o que é acesso a array e o que é acesso direto a string? @RyanNerd afaik essas são duas mesmas coisas, não?
CT.

1
$ string {1} será depreciado em PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

Não posso deixar comentários, mas em relação à resposta do FastTrack, lembre-se também de que o final da linha pode ter apenas um caractere. eu sugeriria

substr(trim($string), -1)

EDIT: Meu código abaixo foi editado por alguém, fazendo com que ele não faça o que eu indiquei. Eu restaurei meu código original e mudei o texto para torná-lo mais claro.

trim(ou rtrim) removerá todo o espaço em branco; portanto, se você precisar verificar um espaço, guia ou outro espaço em branco, substitua manualmente primeiro as várias terminações de linha:

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

12

A partir do PHP 7.1.0, deslocamentos negativos de string também são suportados. Portanto, se você acompanhar os horários, poderá acessar o último caractere na string assim:

$str[-1]

DEMO

A pedido de um @mickmackusa, complemento minha resposta com possíveis formas de aplicação:

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

Usar compensações negativas foi uma técnica mencionada anos antes por RyanNerd. Poste uma resposta somente quando tiver idéias únicas e valiosas para compartilhar.
mickmackusa 25/03

@mickmackusa Por que você escreveu apenas para mim e ignorou as múltiplas variações substr ()?
nektobit 25/03

Nada pessoal, acabei de ver sua resposta muito curta e redundante e decidi soar meu apito. Sinta-se à vontade para denunciar as outras respostas se achar que elas não agregam valor. Lembre-se de que duas respostas podem sugerir a mesma técnica, mas ambas são individualmente valiosas devido ao que é explicado. Este é um local de educação e capacitação - adicionar insights exclusivos às soluções oferecidas anteriormente pode ser bastante valioso para os pesquisadores.
mickmackusa 25/03

Por exemplo, esta resposta foi postada um mês após a mesma técnica. Ia escrever um comentário com a resposta anterior, mas, ao digitar todas as informações que queria oferecer, obviamente era demais comentar sensatamente. Publiquei uma nova resposta e adicionei muitas informações complementares e informações básicas sobre a técnica e incluí uma referência. É assim que uma solução não exclusiva pode ser valiosa para os pesquisadores.
mickmackusa 26/03

5

Eu aconselho a procurar a solução de Gordon, pois é mais 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();

produz algo como

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Este deve ser um comentário sobre a resposta de Gordon.
Ganso

1
Pode confirmar isso. Quanto mais longa sua string, maior é a diferença de desempenho. No meu teste com 10 caracteres substr é de cerca de 20% mais lento
Philipp

Não é de surpreender, pois substr () tem a sobrecarga de uma chamada de função e a outra é a manipulação direta de strings "tipo C". BTW eu executei este código no PHP 7.1-dev com os resultados: substr () levou 7.090255022049seconds \ array acesso levou 2.3145787715912seconds
RyanNerd

4

Lembre-se, se você tiver uma string lida como uma linha de um arquivo de texto usando a fgets()função, precisará usarsubstr($string, -3, 1) para obter o caractere real e não fazer parte do CRLF (Carriage Return Line Feed).

Eu não acho que a pessoa que fez a pergunta precisava disso, mas para mim, eu estava tendo problemas para obter o último caractere de uma string de um arquivo de texto, por isso tenho certeza de que outros encontrarão problemas semelhantes.


2

Você pode encontrar o último caractere usando php de várias maneiras, como substr () e mb_substr () .

Se você estiver usando codificações de caracteres multibyte como UTF-8, use mb_substr em vez de substr

Aqui eu posso mostrar os dois exemplos:

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

DEMONSTRAÇÃO AO VIVO


1

Uma string em diferentes idiomas, incluindo C sharp e PHP, também é considerada uma matriz de caracteres.

Sabendo que, em teoria, as operações de array devem ser mais rápidas do que aquelas que você poderia fazer

$foo = "bar";


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

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

Entretanto, funções de matriz padrão como

count();

não funcionará em uma string.


-3

Siemano, obtenha apenas arquivos php do diretório selecionado:

$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 />';
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.