Utiliser la fonction str_starts_with avec un array

Fermé
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 - 23 mai 2023 à 22:46
jordane45 Messages postés 38456 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 mars 2025 - 31 mai 2023 à 23:34

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

jordane45 Messages postés 38456 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 mars 2025 4 740
Modifié le 31 mai 2023 à 00:15

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" ...


1
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
31 mai 2023 à 21:57

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 :

Pays : =>

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 

$tel = preg_replace('/[^0-9]/', '', $tel);

permet d'ôter le + et d'avoir un numéro "propre", comme dans les liens WhatsApp par exemple.

0
jordane45 Messages postés 38456 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 mars 2025 4 740 > polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023
31 mai 2023 à 23:34

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

0
jordane45 Messages postés 38456 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 mars 2025 4 740
24 mai 2023 à 01:26

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


0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
26 mai 2023 à 08:16

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

0
jordane45 Messages postés 38456 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 26 mars 2025 4 740 > polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023
26 mai 2023 à 08:49

Tu fais quoi de ta ligne 11 ?

Il faudrait l'utiliser dans un IF ...   et si la condition est vérifiée, sortir de la boucle 

0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
30 mai 2023 à 22:57

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...

0