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

Symfony PHP Discussion :

Algorithme pour parcourir tableau php [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Par défaut Algorithme pour parcourir tableau php
    Bonjour,

    Je développe une application sous Symfony 2.8 et j'utilise le bundle IvoryGoogleMapBundle : https://github.com/egeloen/IvoryGoogleMapBundle

    Je dispose d'un tableau d'objet en php $fiches qui contient plusieurs entités Fiche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fiches = $em->getRepository('ProjetAppBundle:Fiche')->findAll();
    Dans une entité Fiche, j'ai notamment une méthode adresseToString() qui me retourne une adresse postale sous la forme d'une String.

    Ce que je dois faire :
    Je dois parcourir le tableau d'objet $fiches et pour chacun des objets Fiche trouvé, je dois utiliser la méthode suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $response = $directions->route(ma_fiche_récupéré->adresseToString(), une_autre_fiche->adresseToString());
    En fait, je veux pouvoir, pour chacune des entités Fiche, utiliser la méthode du dessus qui me permet de cherche un chemin. Le premier argument est l'adresse de départ (donc l'adresse de l'entité Fiche récupérée) et le second est l'adresse d'arrivée.
    C'est pour l'adresse d'arrivée que j'ai un soucis. Je veux appeler cette méthode autant de fois qu'il y a d'entité Fiche pour chacun des objets du tableau !

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fiches { [0] => Fiche {}, [1] => Fiche{}, [2] =>Fiche{}, [3] =>Fiche{} ]
    Ici j'ai mon tableau d'objet avec des entités Fiche. je veux utiliser la méthode du dessus avec pour adresse de départ l'adresse de l'entité Fiche en position 0 et pour adresse d'arrivée l'adresse des entités Fiche en position 1,2,3 mais pas sa propre position (0)! (inutile de chercher un chemin pour aller d'un point au même point).
    Et on recommence avec l'entité en position 1 qui doit récupérer l'adresse de l'entité en position 0 puis 2 puis 3...

    En gros, je dois effectuer la méthode du dessus 3 fois pour chacune des entités.
    Le tout dans une boucle mais là je suis perdu sur l'algo.

    Pas simple d'expliquer.
    Merci de votre aide en tout cas.

    Kévin

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    je ne suis pas sure d'avoir compris et je ne connais pas ton niveau PHP mais bon au cas ou, il existe en php la boucle foreach qui est bien pratique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach (fiches as $key => $fiche){
        dump($fiche);
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Par défaut
    =) Merci mais je connais cette méthode.
    Le sujet n'est pas simple à expliquer.

    tu disposes d'un tableau d'objet Fiche.
    Un objet Fiche dispose de la méthode adresseToString() qui te retourne une adresse postale sous la forme d'une string.

    Le but est que je dois appeler la méthode route(adresseDepart, adresseArrivée) pour chacune des Fiche.

    Donnons 3 fiches avec chacune une adresse respectivement:
    Fiche 1 : 32 rue des paquerettes 14000 Caen
    Fiche 2: 45 allée des macarons 14000 Caen
    Fiche 3: 72 rue des amandes 14000 Caen

    Il faut que j'ai dans une boucle, une façon d'itérer sur chacune des adresses par Objet sans itérer sur sa propre adresse !
    en gros, ça doit faire ça en tâche de fond:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    route(Fiche1->adresseToString(), Fiche2->adresseToString());
    route(Fiche1->adresseToString(), Fiche3->adresseToString());
     
    route(Fiche2->adresseToString(), Fiche1->adresseToString());
    route(Fiche2->adresseToString(), Fiche3->adresseToString());
     
    route(Fiche3->adresseToString(), Fiche1->adresseToString());
    route(Fiche3->adresseToString(), Fiche2->adresseToString());

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Et avoir la référence de la fiche liée comme attribut de ta fiche d'origine c'est pas possible ? C'est une contrainte de ton bundle ?

    Parce que du coup suffirait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($fiches as $f) {
        route($f->adresseToString(), $f->getDestination()->adresseToString());
    }
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 79
    Par défaut
    C'est trop facile si c'était possible =)

    Voici mon code qui fonctionne avec une erreur toutefois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?
    for ($i = 0; $i < count($fiches); $i++) {
        $directions = new Directions(new CurlHttpAdapter());
     
        $depart = $fiches[$i]->addressString();
        for ($j = 0; $j < count($fiches); $j++) {
            $arrivee = $fiches[$j]->addressString();
     
            if ($depart != $arrivee) {
                $response = $directions->route($depart, $arrivee);
            }
            $routes = $response->getRoutes(); 
            //LE SOUCIS VIENT DE LA, COMME LE PREMIER TEST DONNE ARRIVEE = DEPART, ALORS $response sort une erreur :
            // Notice: Undefined variable: response
            foreach ($routes as $route) {
                blablabla
            }
        }
    Je peuc faire l'itération que je veux mais le soucis maintenant c'est au premier test du if, l'adresse toto = toto, donc $response n'existe pas, donc le reste du code bug.
    Comment faire dans le if else pour dire que quand depart = arrivée, il faut continuer la boucle for ?

  6. #6
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    ok j'ai pigé, étant donné que l'algorithmie/l'IA est une passion pour moi voilà ce que je ferai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    foreach (fiches as $key => $fiche){
      foreach (fiches as $key2 => $fiche2){
         if ($key!=$key2) {
                 $response = $directions->route($fiche->addressString(), $fiche2->addressString());
         }
      }
    }
    avec 3 fiches ça fera les couples de fiche suivants :
    1-2    1-3
    2-1    2-3
    3-1    3-2
    Après pour info, comme dirait nico_f en amont on peux récupérer les bons couple avec une requête en base genre :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT fiche As f1 JOIN  SELECT DISTINCT fiche AS f2 ON f1!=f2
    un truc comme ça lol je ne suis pas trop doué en requête

  7. #7
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Hello,

    Si j'ai bien compris, tu veux faire toutes les paires distinctes possibles. Si tu as n adresses, tu vas avoir n*(n-1) paires possibles.
    Si tu estimes que la paire (1 - 2) et (2 - 1) sont identiques tu en auras moitié moins n*(n-1)/2.

    Dans les deux cas, la solution la plus simple se trouve pour moi au niveau de la requête. En faisant une requête qui te retourne directement les paires possibles, tu n'as plus d'algo à faire au niveau métier.

    Construit ta requête de manière à ce qu'elle te retourne toutes les paires possibles (en excluant celles ou Fiche1 = Fiche2) et tu n'auras plus rien à faire coté code C'est à mon avis la technique qui sera également la plus performante.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. tableau php ver SQL | algorithme pour former l'arborescence
    Par spy74 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 17/01/2009, 12h13
  2. Algorithme de recherche pour un tableau
    Par bourgot dans le forum Mathématiques
    Réponses: 1
    Dernier message: 23/05/2007, 18h34
  3. meilleur moyen pour parcourir un tableau
    Par deubelte dans le forum C++
    Réponses: 22
    Dernier message: 26/02/2007, 10h01
  4. [HTML/PHP] Aide (basique) pour un tableau
    Par PedroBD dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 28/09/2006, 11h58
  5. Meilleure Méthode pour parcourir un tableau
    Par KPitN dans le forum MFC
    Réponses: 7
    Dernier message: 24/02/2005, 16h19

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