IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Recherche clé dans tableau multi-dimensionnel


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 37
    Par défaut [Tableaux] Recherche clé dans tableau multi-dimensionnel
    Bonjour

    Je cherche une fonction permettant de retourner toutes les clés correspondant à une valeur dans un tableau multi-dimensionnel.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $tableau[0]['age']=19;
    $tableau[0]['prenom']="Pierre";
     
    $tableau[1]['age']=21;
    $tableau[1]['prenom']="Paul";
     
    $tableau[2]['age']=21;
    $tableau[2]['prenom']="Jacques";
    je voudrai connaitre les clés de mon tableau des personnes ayant 21 ans..

    merci de votre aide!

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    bon, pour moi, qui suis un invétérer de la boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $tableau[0]['age']=19;
    $tableau[0]['prenom']="Pierre";
     
    $tableau[1]['age']=21;
    $tableau[1]['prenom']="Paul";
     
    $tableau[2]['age']=21;
    $tableau[2]['prenom']="Jacques";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $age =21;
     
    for ($i=0; $i< count($tableau) ; $i++ ){
     
    if ($tableau[$i]["age"]==$age){
     
    echo $tableau[$i]["prenom"]." à :".$age."<br />";
     
     
    }
    }
    c'est un bon exemple, de ce que l'on doit savoir faire, pour récupérer des données, d'un fichier ou d'une base de données.


    Il faut cependant pousser la réflexion, c 'est à dire :
    pourquoi utiliser le tableau multi dimentionnel dans le sens $tableau[0]['age'] et non, dans le sens $tableau['age'][0]


    Bien que la réponse tombe sous le sens, si tu ne la pas comprise, continu sur la voie de l'apprentissage de choses simples,
    comme pour cette question.


    bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 37
    Par défaut
    Merci pour ta réponse Ascito

    mais j'aurai du préciser "sans parcourir les valeurs de mon tableau" car il peut contenir au moins 10000 enregistrements et la boucle s'avère un peu longue à l'exécution... je pensais plus à une fonction "native" du genre array_search mais étendue aux tableaux mutlidimensionnels!

    par contre je suis un invétéré des tableaux multiples mais je n'avais jamais envisagé de mettre le paramètre comme clé ($tableau['age'][0], $tableau['prenom'][0] ...) Cela n'est-il pas plus lourd avec beaucoup d'enregistrements ?

  4. #4
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Tu n'as je pense pas d'autre solution que de parcourir ton tableau ! Et quand bien même une fonction ferait exactement ce que tu souhaites, elle parcourerait elle aussi ton tableau

    Par contre, plutôt qu'un for, j'utiliserais personnellement plutôt un foreach.

    Une dernière piste : n'est-il pas possible de filtrer tes données lors de l'initialisation du tableau ? Comment récupères-tu ces informations ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 37
    Par défaut
    Ok merci Eusebe

    je récupère ces données à partir d'une table MySQL. L'exemple était vraiment à titre d'exemple En réalité il s'agit d'une gestion budgétaire. Je récupère toutes mes lignes de budgets dans un tableau afin de l'envoyer vers mon moteur de templates (smarty).

    Donc je procede comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //Parcours des lignes de mon budget
    while($data_lignes_budgets = mysql_fetch_array($res_lignes_budgets)) {
         $tab_lignes_budgets[$data_lignes_budgets['ID']]['code'] = $data_lignes_budgets['code'];
         $tab_lignes_budgets[$data_lignes_budgets['ID']]['quantite'] = $data_lignes_budgets['quantite'];
         $tab_lignes_budgets[$data_lignes_budgets['ID']]['prix_unitaire'] = $data_lignes_budgets['prix_unitaire'];
         $tab_lignes_budgets[$data_lignes_budgets['ID']]['montant'] = $data_lignes_budgets['montant'];
         //ETC...
     
    }
    ensuite j'ai besoin d'afficher pour chaque ligne de mon budget le montant correspondant au meme poste (code) d'un autre budget dit "de comparaison".
    Donc je pensais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $sql = "SELECT code, montant FROM t_lignes_budgets WHERE id_budget = ".$id_budget_comparaison." AND montant IS NOT NULL";
    $res = mysql_query($sql);
    while($data_budget_comparaison = mysql_fetch_array($res)) {
         $id_ligne_budget = retourne_keys($tab_lignes_budgets,$data_budget_comparaison['code']);
    //c'est ici que je veux récuperer l'ID du tableau $tab_lignes_budgets 
    //dont le code correspond à celui de mon resultat... 
    //d'ou l'objet de la discussion!
     
          $tab_lignes_budgets[$id_ligne_budget]['montant_comparaison'] = $data_budget_comparaison['montant'];
    }
    A savoir que le poste (code) n'est pas forcement unique, il peut y avoir des doublons donc plusieurs ID par code...

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    D'accord, Et comment tu trouves l'identifiant du budget de comparaison ?
    Et quelle est la requête qui te permet de récupérer tes lignes de budget ?

    Parce que le plus efficace dans ton cas, ce serait de faire une seule requête sql qui permette de récupérer directement les lignes budgets et les montants des budgets de comparaison.

    Ca limitera à la fois la charge de ton serveur web (moins de boucles en php) et celle de ton serveur de base de données (une seule requête plutôt que 2 ? 50 ?)

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/12/2011, 13h12
  2. Réponses: 5
    Dernier message: 13/02/2008, 17h52
  3. Réponses: 5
    Dernier message: 04/10/2006, 18h49
  4. [Tableaux] Tableau multi dimensionnel
    Par gids01 dans le forum Langage
    Réponses: 7
    Dernier message: 02/10/2006, 16h18
  5. [Tableaux] tri sur un tableau multi-dimensionnel
    Par nicoaix dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2006, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo