Manipulation d'un tableau associatif

Eléphanteau du PHP | 31 Messages

02 janv. 2009, 09:54

Bonjour,

Ayant toujours été un peu déconcerté par la manipulation de tableaux, et ne maîtrisant pas bien l'affaire en dépit d'une bonne volonté évidente (et d'un temps considérable à essayer de me concentrer sur les manuels PHP), je sollicite une fois de plus votre aide.

Je souhaite afficher dans un formulaire un menu déroulant avec une liste de pays.

J'ai récupéré cette liste sous la forme d'un tableau qui se présente ainsi :

Code : Tout sélectionner

$liste_pays = array( 'AF' => array('FR' => 'Afghanistan', 'EN' => 'Afghanistan'), 'ZA' => array('FR' => 'Afrique du Sud', 'EN' => 'South Africa'), 'AL' => array('FR' => 'Albanie', 'EN' => 'Albania'),
[etc.]

Je suis un peu perdu sur la façon d'utiliser le foreach (j'imagine) pour pouvoir afficher par exemple seulement les pays en version FR ou seulement version EN (ou autre, car je compte ajouter d'autres traductions par la suite).

L'idée étant de pouvoir associer à <option value=''> le code pays 'AF' ou 'ZA' par exemple, et par contre d'afficher le nom complet du pays.

Voilà, merci par avance pour cet instant pédagogique !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 janv. 2009, 10:08

Bonjour,

Voici la solution à ton problème avec des commentaires afin que tu puisses comprendre et le refaire par toi même quand tu en auras besoin :
$liste_pays = array(
 'AF' => array('FR' => 'Afghanistan', 'EN' => 'Afghanistan'),
 'ZA' => array('FR' => 'Afrique du Sud', 'EN' => 'South Africa'),
 'AL' => array('FR' => 'Albanie', 'EN' => 'Albania')
);

// On démarre la construction du menu déroulant
print "<select>";

foreach ($liste_pays as $code_pays => $tablo_infos_pays) {
     // désormais on a (exemple pour le deuxième pays de ta liste) :
     // $code_pays = "ZA"
     // $tablo_infos_pays = array('FR' => 'Afrique du Sud', 'EN' => 'South Africa')
     // $tablo_infos_pays['FR'] = "Afrique du Sud"
     // $tablo_infos_pays['EN'] = "South Africa"

     // Et donc on affiche pour chaque pays l'option avec les bonnes valeurs pour la liste déroulante
     print "<option value=\"".$code_pays."\">".$tablo_infos_pays['FR']."</option>\r\n";
}
print "</select>";
Si tu as des questions n'hésites pas :)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 31 Messages

02 janv. 2009, 10:36

Merci mille fois pour ta réponse précise, rapide et sympathique !

Evidemment, ça marche très bien ainsi.



[ma demande originelle a été modifiée car j'ai trouvé l'erreur moi-même ^^]
Modifié en dernier par cyberlp le 02 janv. 2009, 12:16, modifié 1 fois.

Mammouth du PHP | 693 Messages

02 janv. 2009, 12:14

Utilise les balises PHP au lieu des balises code pour avoir la coloration syntaxique et tu verras qu'il y a un petit problème
echo "$tablo_infos_pays[$lang]"</option>\r\n";  
Tu finis ta chaine, puis tu envois des balises HTML qui n'ont aucun sens pou PHP, puis tu ouvre une deuxième chaine.

Le mieux, c'est de sortir la variable de la chaine puis concaténer avec la chaine en dur, comme ca
echo $tablo_infos_pays[$lang]."</option>\r\n";  

Eléphanteau du PHP | 31 Messages

02 janv. 2009, 12:17

Merci orgerix.

Est-il possible de classer les résultats par ordre alphabétique, soit du code pays, soit du nom du pays ?

Merci encore

Mammouth du PHP | 959 Messages

02 janv. 2009, 12:40

Regardes du côté des fonctions asort() et de array_multisort() ;)

Eléphanteau du PHP | 31 Messages

04 janv. 2009, 01:15

Merci, j'ai regardé du côté de la 2e fonction qui à priori s'applique à mon tableau, mais je ne comprends pas comme l'utiliser dans ce cas précis.

Si j'ai un tableau du style :

Code : Tout sélectionner

$liste_pays = array( 'AF' => array('fr' => 'Afghanistan', 'en' => 'Afghanistan', 'es' => 'Afganistán (el)'), 'ZA' => array('fr' => 'Afrique du Sud', 'en' => 'South Africa', 'es' => 'Sudáfrica'), 'AL' => array('fr' => 'Albanie', 'en' => 'Albania', 'es' => 'Albania'), );
que j'affiche ainsi :

Code : Tout sélectionner

foreach ($liste_pays as $code_pays => $tablo_infos_pays) { echo "<option value=$code_pays"; if ($code_pays==$pays) { echo " selected>"; } else { echo ">"; } echo "$tablo_infos_pays[$lang]</option>\r\n"; }
comment trier à la fois le tableau 'fr', 'en' et 'es' par ordre alphabétique ?

pour explication : $pays est la variable qui récupère le nom du pays dans la BDD, pour l'afficher par défaut ds le menu déroulant ; et $lang est la langue par défaut récupérée depuis un cookie, pour pouvoir choisir quel tableau afficher dans le menu déroulant (fr, en ou es)