Détermination du chemin d'indexage menant à une valeur dans un tableau multi-dimensionnel

Contenu du snippet

Cette fonction sert à trouver tous les indices qu'il faut suivre dans un tableau multidimentionnel pour localiser une valeur dans ce tableau.

Elle est surtout pratique si l'on doit travailler sur un tableau dont on ne connait pas la structure et la taille.

Elle renvoie une chaîne contenant tous les indices menant à la valeur recherchée.

La recherche est sensible à la casse, et les index associatifs ne doivent pas contenir d'apostrophes ['].

Source / Exemple :


<?php
function Trouve_indice($Tableau,$Val)
{
static $Drapeau=false;static $Compteur=false;static $Result=array(); static $Tbl_origine=array();
//Cette fonction sert à trouver tous les indices dans un tableau multidimentionnel pour localiser une valeur dans ce tableau

  if($Compteur==false)    //$Compteur permet d'assigner à $Tbl_origine le tableau passé en paramètre lors du premier appel de la fonction
  {                       //En effet, lorsque l'on trouve la valeur le tableau en cours est celui contenant cette valeur.
  $Tbl_origine=$Tableau;
  $Compteur=true;
  }

  if(in_array($Val,$Tableau))
  {
  $Drapeau=true;
  $Result[]=array_search($Val,$Tableau);
    /*On récupère le chemin d'indexation menat à la valeur
    Afin d'éviter Fatal error: Cannot use string offset as an array in..., on :

    - Inverse le tableau de résultats
    - Remonte l'arborescence jusqu'à trouver l'indice "racine" menant à la valeur
    - On renvoie la chaîne de caractères composée */
  
  $Result=array_reverse($Result);

       foreach($Result as $Check)
       {
        //Pour gérer les indices associatifs
         $Guillemets=gettype($Check)=="string" ? "'" : "";
         $Code="[".$Guillemets.$Check.$Guillemets."]".$Code;
  
         eval('$Test=$Tbl_origine'.$Code.';');
         if($Test==$Val) break;
      }
  return $Code;
  }

foreach($Tableau as $Cle=>$Valeur)
{
   if($Drapeau==true) break;//break; Pour remonter l'arborescence d'appel de la fonction en gardant le résultat

   if(is_array($Valeur))
   {
    $Result[]=$Cle; //$Result[]=$Cle: On rajoute l'indice parcouru dans le tableau de résultats
    $Result=Trouve_indice($Valeur,$Val);
   }
}
return $Result;
}
?>

Conclusion :


Un petit exemple :

$Couleurs=array(
array("vert","bleu","jaune","rouge"),
array("rose","violet"),
array("marron","noir","gris",array("lie de vin","caca d'oie","vert d'eau","fuchia","La bonne est la"=>"blanc")),
array("pourpre","orange","kaki"));

$Indice=Trouve_indice($Couleurs,"blanc");
echo $Indice //Ca affiche [2][3]['La bonne est la']

eval('echo $Couleurs'.$Indice.';'); //Cela affichera blanc

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.