Utiliser la fonction str_starts_with avec un array
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
Bonsoir à tous,
Je cherche à créer une fonction somme toute assez simple, en utilisant la fonction str_starts_with (dispo à partir de PHP 8.0).
En effet, je cherche à créer une fonction permettant de savoir si le nombre entré dans un champ commence par un nombre présent dans un array prédéterminé. Exemple : le nombre 33601020304 commence par 33, nombre contenu dans mon array.
Voici mon code :
function tel_code($tel){ $tel = preg_replace('/[^0-9]/', '', $tel); $tel = ltrim($tel, '0'); $tel_array = array('32' => 'Belgique', '33' => 'France', '34' => 'Espagne', '41' => 'Suisse', '44' => 'Royaume-Uni', '49' => 'Allemagne'); if(str_starts_with($tel, $tel_array)){ echo 'OK'.' '.$tel; }else{ echo 'PB'.' '.$tel; } }
Le but final étant, en fonction de l'indicatif initial, de retourner le nom du pays inscrit dans l'array.
Ce n'est pas un problème de version PHP puisque j'ai la version 8.2, et la fonction marche avec une seule valeur, simplement je m'interrogeais si cela était possible avec plusieurs ?
Pour l'instant, la fonction plante avec l'array, il n'y a même pas d'erreur affichée, juste une page blanche.
Par avance, je vous remercie de votre aide.
Bonne soirée
3 réponses
Tu as un code qui est celui la
$tel_array = array('32' => 'Belgique', '33' => 'France', '34' => 'Espagne', '41' => 'Suisse', '44' => 'Royaume-Uni', '49' => 'Allemagne'); foreach($tel_array as $pays => $code) { str_starts_with($tel, $pays); }
Je te dis.. tu fais quoi de ta ligne 11 ? .. il faudrait la mettre dans un IF ...
La ligne 11 étant
str_starts_with($tel, $pays);
... regarde donc la doc de cette fonction.. il y a des exemples : https://www.php.net/manual/en/function.str-starts-with.php
Donc.. on pourrait s'attendre à ce que tu modifie cette ligne sous la forme
if( str_starts_with($tel, $pays) ) { // Si la chaine commence par... // .. ici tu fais ce que tu veux quand la condition se vérifie ! // par exemple... echo "Pays :" . $pays . " => " . $code; break;//on sort de la boucle }
NB: Attention ... +33601020304 .. ça ne commence pas par "33" ... mais par "+33" ...
Bonjour
Quand tu as un doute sur le fonctionnement d'une fonction, il faut aller regarder le doc
https://www.php.net/manual/en/function.str-starts-with.php
Bonjour jordane45,
Merci pour ta réponse, en effet, je croyais naïvement qu'un array était supporté par cette fonction.
Depuis j'ai avancé un peu et me suis résolu à faire une boucle, ce qui me semble le plus simple encore, étant donné l'état de mes connaissances en PHP.
Sur la structure de ma boucle je crois qu'elle est globalement pas trop mauvaise, mais je n'arrive pas à en afficher le résultat surtout.
Voici le code que j'ai mis en place, mais je n'arrive pas à afficher à la fin l'indicatif correspondant au numéro que j'ai entré, ni le pays :
$tel = '+33601020304'; $tel = preg_replace('/[^0-9]/', '', $tel); //33601020304 $tel = ltrim($tel, '0'); //33601020304 $tel_array = array('32' => 'Belgique', '33' => 'France', '34' => 'Espagne', '41' => 'Suisse', '44' => 'Royaume-Uni', '49' => 'Allemagne'); foreach($tel_array as $pays => $code) { str_starts_with($tel, $pays); }
L'idée étant d'afficher le nom du pays en fonction de l'indicatif trouvé au début de la chaîne après avoir testé tous les indicatifs de l'array.
Mais je sèche complètement sur la partie récupération du résultat de la boucle et affichage. Peut-être faudrait-il ensuite faire un switch pour afficher le nom du pays en fonction de l'indicatif ?
Bonne journée
polarbird
Bonsoir jordane45,
Justement, je ne vois pas très bien comment on peut vérifier la condition dans la mesure où il y a plusieurs valeurs...
J'ai essayé de mettre en place une condition pour vérifier si la valeur de tel commence bien par une des valeurs de l'array :
if(array_key_exists($pays, $tel_array)){ echo 'OK'; }else{ echo 'PB'; } if(in_array($pays, $tel_array)){ echo 'OK'; }else{ echo 'PB'; }
Lorsque j'entre comme tel +33601020304, la première condition me renvoie OK et la seconde PB. Et le résultat est identique lorsque j'entre un numéro commençant par +55 par exemple (indicatif qui n'est pas dans l'array.
C'est pourquoi je suis totalement perdu...
Bonsoir jordane45, merci beaucoup pour ta réponse.
J'ai regardé la doc il y a plusieurs jours déjà, mais elle ne supporte pas encore array, c'est pourquoi j'étais parti sur un foreach, qui traite les données une par une.
Lorsque j'essaie ton code avec le 33601020304, j'obtiens le résultat suivant :
La boucle if n'arrive pas à traiter les données de l'array on dirait, même si ton intuition m'a l'air pertinente.
NB : si, cela commence bien par 33, car la ligne
permet d'ôter le + et d'avoir un numéro "propre", comme dans les liens WhatsApp par exemple.
Ne te reste plus qu'à mettre un peu de debug à l'intérieur de ta boucle sur les différentes variables pour voir quels sont leurs valeurs au moment où le écho s'affiche