Comment obtenir le dernier caractère d'une chaîne en PHP?


Réponses:


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

Ou, pour les chaînes multi-octets:

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

114
Si vous utilisez des encodages de caractères multi-octets comme UTF-8, utilisez plutôtmb_substr ( php.net/mb_substr ).
Gumbo

9
tant pour mon substr ($ string, strlen ($ string) -1, 1) ;. On dirait que j'ai pris le LONG chemin!
jeffkee

4
Vous n'avez besoin de fonctions de chaîne multi-octets que si la chaîne est évaluée en tant que chaîne binaire. Aka, quand php ne connaît pas l'encodage. Sinon, les fonctions de chaîne non multioctets typiques fonctionneront très bien.
Ray Foss


70

Ou par accès direct aux chaînes :

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

Notez que cela ne fonctionne pas pour les chaînes multi-octets. Si vous devez travailler avec une chaîne multi-octets, envisagez d'utiliser la mb_*famille de fonctions chaîne.

Depuis PHP 7.1.0, les indices numériques négatifs sont également pris en charge, par exemple juste $string[-1];


2
J'aime cette réponse de style C, je me demande pourquoi cela n'a eu que quelques votes positifs.
Valentin Mercier

16
@ValentinMercier: Parce que c'est une question PHP, pas C.
Martin Thoma

1
Je pense que c'est une meilleure solution car elle vous permet de modifier le caractère, contrairement à la solution substr donnée ci-dessus.
cazort

Notez que cela lancera un avis si la chaîne est vide.
Scott Buchanan

40

Depuis PHP 7.1, vous pouvez le faire ( rfc accepté pour les décalages de chaîne négatifs ):

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

Je vous laisse deviner la sortie.

Aussi, j'ai ajouté cela au code de performance de xenonite avec ces résultats:

substr () a pris 7.0334868431091secondes

l'accès à la baie a pris 2,3111131191254 secondes

L'accès direct aux chaînes (décalages de chaînes négatifs) a pris 1,7971360683441secondes


Merci d'avoir publié des repères! Si quelqu'un s'intéresse aux benchmarks C # pour faire la même chose, cette page est une bonne lecture. L'accès direct au dernier personnage l'a emporté.

pourriez-vous expliquer davantage la différence entre [] et {} dans ce contexte?
Taufik Nur Rahmanda

2
@TaufikNurRahmanda Techniquement, il n'y a pas de différence entre [] et {}. Les développeurs PHP ont donné la possibilité d'utiliser l'un ou l'autre. Pour plus de détails, voir: php.net/manual/en/migration71.new-features.php
RyanNerd

qu'est-ce que l'accès aux tableaux et qu'est-ce que l'accès direct aux chaînes? @RyanNerd afaik ce sont 2 mêmes choses, non?
CT.

1
$ string {1} sera déprécié en PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Tony Vlcek

17

Je ne peux pas laisser de commentaires, mais en ce qui concerne la réponse de FastTrack, rappelez-vous également que la fin de la ligne peut ne comporter qu'un seul caractère. je voudrais suggerer

substr(trim($string), -1)

EDIT: Mon code ci-dessous a été édité par quelqu'un, ce qui ne fait pas ce que j'ai indiqué. J'ai restauré mon code d'origine et changé le libellé pour le rendre plus clair.

trim(ou rtrim) supprimera tous les espaces, donc si vous avez besoin de rechercher un espace, une tabulation ou un autre espace, remplacez d'abord manuellement les différentes fins de ligne:

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

12

Depuis PHP 7.1.0, les décalages de chaîne négatifs sont également pris en charge. Donc, si vous suivez l'heure, vous pouvez accéder au dernier caractère de la chaîne comme ceci:

$str[-1]

DEMO

A la demande d'un @mickmackusa, je complète ma réponse par des modalités d'application possibles:

<?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'utilisation de compensations négatives était une technique mentionnée des années plus tôt par RyanNerd. Veuillez publier une réponse uniquement lorsque vous avez des informations uniques et précieuses à partager.
mickmackusa

@mickmackusa Pourquoi ne l'avez-vous écrit que pour moi et ignoré les multiples variations substr ()?
nektobit

Rien de personnel, je viens de voir votre réponse très courte et redondante et j'ai décidé de siffler. N'hésitez pas à dénoncer les autres réponses si vous pensez qu'elles n'apportent aucune valeur. Gardez à l'esprit que deux réponses peuvent suggérer la même technique, mais les deux ont une valeur individuelle en raison de ce qui est expliqué. C'est un lieu d'éducation et d'autonomisation - l'ajout de perspectives uniques aux solutions précédemment proposées peut être très précieux pour les chercheurs.
mickmackusa

Par exemple, ma réponse a été publiée un mois après la publication de la même technique. J'allais écrire un commentaire sous la réponse précédente, mais comme j'ai tapé toutes les informations que je voulais offrir, c'était évidemment trop pour commenter de manière sensée. J'ai posté une nouvelle réponse et ajouté de nombreuses informations complémentaires et des informations de base concernant la technique et inclus une référence. C'est ainsi qu'une solution non unique peut être utile aux chercheurs.
mickmackusa

5

Je conseillerais d'opter pour la solution de Gordon car elle est plus performante 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();

sort quelque chose comme

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

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Cela devrait être un commentaire sur la réponse de Gordon.
Goose

1
Je peux le confirmer. Plus votre chaîne est longue, plus la différence de performance est grande. Dans mon test avec 10 caractères, le substrat est environ 20% plus lent
Philipp

Pas surprenant car substr () a la surcharge d'un appel de fonction et l'autre est une manipulation de chaîne directe de type "C". BTW J'ai exécuté ce code sur PHP 7.1-dev avec les résultats: substr () a pris 7.090255022049seconds \ array access a pris 2.3145787715912seconds
RyanNerd

4

Rappelez-vous, si vous avez une chaîne qui a été lue comme une ligne d'un fichier texte à l'aide de la fgets()fonction, vous devez utilisersubstr($string, -3, 1) pour obtenir le caractère réel et ne pas faire partie du CRLF (Carriage Return Line Feed).

Je ne pense pas que la personne qui a posé la question en ait eu besoin, mais pour moi, j'avais du mal à obtenir ce dernier caractère d'une chaîne à partir d'un fichier texte, donc je suis sûr que d'autres rencontreront des problèmes similaires.


2

Vous pouvez trouver le dernier caractère en utilisant php de nombreuses façons comme substr () et mb_substr () .

Si vous utilisez des encodages de caractères multi-octets comme UTF-8, utilisez mb_substr au lieu de substr

Ici, je peux vous montrer les deux exemples:

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

DÉMO EN DIRECT


1

Une chaîne dans différents langages, y compris C sharp et PHP est également considérée comme un tableau de caractères.

Sachant qu'en théorie, les opérations sur les tableaux devraient être plus rapides que celles que vous pourriez faire avec des chaînes,

$foo = "bar";


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

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

Cependant, les fonctions de tableau standard comme

count();

ne fonctionnera pas sur une chaîne.


-3

Siemano, obtenez uniquement les fichiers php du répertoire sélectionné:

$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 />';
  }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.