Retourner la clé d'un tableau d'une valeur contenu dans une chaîne de texte

Eléphanteau du PHP | 17 Messages

10 sept. 2019, 17:36

Bonjour à tous,

Voilà le cas de figure basique pour bon nombre d'entre vous je suis certain !

Code : Tout sélectionner

$refTerritoire = array ( "Personne1" => "Brandivy,Colpo,Elven,Grand-Champ,Locmaria-Grand-Champ,Locqueltas,Meucon,Monterblanc,Plaudren,Plescop,Saint-Avé,Saint-Nolff,Sulniac,Trédion,Treffléan", "Personne2" => "Arradon,Baden,Bono,Île d'Arz,Île-aux-moines,Larmor-Baden,Ploeren,Plougoumelen,Séné,Vannes", "Personne3" => "Arzon,La Trinité-Surzur,Le Hézo,Le-Tour-Du-Parc,Saint Gildas de Rhuys,Saint-Armel,Sarzeau,Surzur,Theix-Noyalo", ); // on ramène la clé du tableau (nom de la personne) qui correspond à la ville interrogée : $referent = array_search('Arradon', $refTerritoire);
Bien entendu ça ne fonctionne pas car ma valeur recherchée est présente dans une chaîne de texte. Mon approche n'est pas la bonne. Quel est le meilleur moyen de construire mon tableau sans avoir à répéter le nom des personnes autant de fois que de communes ?

D'avance merci pour votre aide :D

Eléphant du PHP | 150 Messages

10 sept. 2019, 19:53

Bonsoir,

Vu comment est construit ton tableau tu vas être obligé de chercher dans les valeurs de ton tableau

$refTerritoire = array (
    "Personne1" => "Brandivy,Colpo,Elven,Grand-Champ,Locmaria-Grand-Champ,Locqueltas,Meucon,Monterblanc,Plaudren,Plescop,Saint-Avé,Saint-Nolff,Sulniac,Trédion,Treffléan",
    "Personne2" => "Arradon,Baden,Bono,Île d'Arz,Île-aux-moines,Larmor-Baden,Ploeren,Plougoumelen,Séné,Vannes",
    "Personne3" => "Arzon,La Trinité-Surzur,Le Hézo,Le-Tour-Du-Parc,Saint Gildas de Rhuys,Saint-Armel,Sarzeau,Surzur,Theix-Noyalo",
  );

  $referent = false;
  
  // on ramène la clé du tableau (nom de la personne) qui correspond à la ville interrogée :
  
  // Parcours tout le tableau
  foreach( $refTerritoire as $key => $territoire ) {
  
    //Si la valeur contient "Arradon"
    if( strpos($territoire, "Arradon") !== FALSE ){
        $referent = $key;
    }
  }
  
 // Affiche Personne2. 
echo $referent;

Avec la petite différence que array_search retourne la première clé trouvé, alors qu'ici on retournera la dernière
Cordialement
Naroth

Eléphanteau du PHP | 17 Messages

11 sept. 2019, 10:25

Pouahh un grand merci Naroth !
C'est tout bon !

Est-ce qu'une autre approche serait plus conseillée du type double tableau :

Code : Tout sélectionner

$Personne1 = array ("Brandivy","Colpo","Elven","Grand-Champ"...); $Personne2 = array("Arradon","Baden","Bono"...); ...
Et ensuite construire un super tableau :

Code : Tout sélectionner

$refTerritoire = array ($personne1,$personne2,$personne3);
On cherche ensuite la valeur exacte de la commune dans ce "super tableau" ?

Merci pour ton éclairage ! J'aime avoir la solution la plus académique !

Eléphant du PHP | 150 Messages

11 sept. 2019, 12:52

Le problème principal de l'approche que tu nous propose est que strpos recherche la première occurrence d'une chaîne, strpos peut donc trouver des occurrences contenant la dites chaines

par exemple :

Ici mon objectif est de trouver le département "Loire" (42)
$departements = array(
"groupe1" => "Haute-Loire,Loire, Ain"
"groupe2" => "Loire Atlantique,Rhône, Savoie"
);


Si j'utilise la fonction que je t'ai proposé, la clé qui me sera retournée sera "groupe2" parce que "Loire Atlantique" contient Loire.

Je te conseillerais effectivement de faire un tableau à plusieurs dimensions
$refTerritoire = array (
     "Personne1" => array( "Brandivy","Colpo","Elven","Grand-Champ"...),
     "Personne2" => array("Arradon","Baden","Bono"...)
);
Ce qui évitera toutes possibilités de chaînes présentent dans une autre et de mauvais retour.
Cordialement
Naroth