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 :

Comparaison de deux tableaux


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut Comparaison de deux tableaux
    Bonjour, j'essaie de comparer deux Array issus de deux requetes avec deux boucles for imbriquées (mes tentatives avec foreach ont échoué lamentablement). Seulement voilà, après abus de moult print_r, je ne sais pas où ça bloque...
    Je vous mets ici le code. Au début on a les deux requetes. Ensuite les boucles for. A l'exécution, je me retrouve avec $etatValidation toujours égal à 0 (avec ou sans le break d'ailleurs).

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //recuperer les effectivites validees
    		$tableEffectivitesValidees = Doctrine_Core::getTable('EffectivitesValidees');
    		$requete = $tableEffectivitesValidees->createQuery();
    		$requete->select('serie');
    		$requete->where('modele = ?', $modele);
    		$requete->andWhere('typeConstructeur = \'78M 001\' '); //PAS DE TYPE CONSTRUCTEUR DANS PARAMS!!!
    		$requete->andWhere('numArticle = ? OR numArticle = ?', array($refFournisseur, $refOskar));
    		$req1res = $requete->execute(array(), Doctrine::HYDRATE_SCALAR); 
     
    		//recuperer les series a comparer
    		$tableSeriesVehicule = Doctrine_Core::getTable('SeriesVehicule');
    		$requete2 = $tableSeriesVehicule->createQuery();
    		$requete2->select('serie');
    		$requete2->where('modele = ?', $modele);
    		$requete2->andWhere('typeConstructeur = \'78M 001\' '); //PAS DE TYPE CONSTRUCTEUR DANS PARAMS!!!
    		$req2res = $requete2->execute(array(), Doctrine::HYDRATE_SCALAR); 
     
    		//comparer ici
    		$sizeReq1res = count($req1res);
    		$sizeReq2res = count($req2res);
     
    		for($i = 0; $i < $sizeReq1res; $i++){
    			$etatValidation = 0;
    			for($j = 0; $j < $sizeReq2res; $j++){
    				if($req1res[$i] == $req2res[$j]){
    					$etatValidation = 1;
    					break;
    				}
    			}
    		}
    		//comparer ici FIN
    Toute aide serait la bienvenue. Merci!

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    C'est normal : si ta condition est remplie, le break fait sortir de la boucle intérieure mais n'interfère pas avec la boucle extérieure. Ton flag est donc remis à 0, il ne vaudra 1 à la sortie que si le tout dernier test est bon.

    Remets ton algorithme à plat, éventuellement en le décrivant ici si tu bloques (mais je pense que c'est un problème d'algorithmique de base, donc tu dois pouvoir trouver la solution en énonçant bien le problème )

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Bonjour,

    Plusieurs choses par rapport cet algorithme :
    - PHP possède le "foreach", qui te permet de boucler sur des tableaux ou des collections d'objets. Ton code sera bien plus léger à utiliser (pas besoin de tes "count") ;
    - ton problème semble assez trivial : trouver si deux tableaux ont au moins un élément commun (c'est comme ça que je le comprends). Cela m'étonnerait beaucoup que PHP ne fournisse pas déjà une fonction toute prête pour ça. Un coup d'oeil dans la doc PHP t'en dira plus.

    Et le dernier point, surement le plus important :
    - ton algorithme n'a pas le comportement attendu ? Testes-le ! Surtout qu'ici c'est très facile à faire :
    1. sors ton algorithme dans une méthode qui prend en argument tes deux tableaux ;
    2. créés un script PHP où tu définis plusieurs tableaux de façon à tester ta méthode sur plusieurs cas. Observe les résultats et là où ça pèche. Si tu as phpunit installé sur ton serveur, tout est prêt pour !

    Sinon, comme t'a indiqué Hérode, tu as un premier problème avec ton break. Et surement un second sur ton initialisation $etat = 0 qui devrait être avant la première boucle.

  4. #4
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Citation Envoyé par bilbonec Voir le message
    Plusieurs choses par rapport cet algorithme :
    - PHP possède le "foreach", qui te permet de boucler sur des tableaux ou des collections d'objets. Ton code sera bien plus léger à utiliser (pas besoin de tes "count") ; -> c'est ce que j'avais fait au début, ça ne marchait pas donc j'ai changé, mais j'ai bien compris que c'est moi le problème et pas le foreach
    - ton problème semble assez trivial : trouver si deux tableaux ont au moins un élément commun (c'est comme ça que je le comprends). Cela m'étonnerait beaucoup que PHP ne fournisse pas déjà une fonction toute prête pour ça. Un coup d'oeil dans la doc PHP t'en dira plus. -> j'ai vu les fonctions array_intersect notamment et leur famille, le problème c'est qu'elles me renvoient un tableau, alors qu'ici je veux que pour chaque ligne, chaque entrée l'état soit changé, au fur et à mesure

    Et le dernier point, surement le plus important :
    - ton algorithme n'a pas le comportement attendu ? Testes-le ! Surtout qu'ici c'est très facile à faire :
    1. sors ton algorithme dans une méthode qui prend en argument tes deux tableaux ;
    2. créés un script PHP où tu définis plusieurs tableaux de façon à tester ta méthode sur plusieurs cas. Observe les résultats et là où ça pèche. Si tu as phpunit installé sur ton serveur, tout est prêt pour ! -> je teste mais mon problème ne réside pas vraiment dans mes boucles (selon moi), le problème c'est la requete à la fin qui me renvoie les données... Je devrais l'incorporer dans les boucles si je veux que chaque entrée soit affectée d'une valeur d'état différente mais je ne vois pas comment, et tout ce que j'ai essayé marche pas

    Sinon, comme t'a indiqué Hérode, tu as un premier problème avec ton break. Et surement un second sur ton initialisation $etat = 0 qui devrait être avant la première boucle. -> OK. Pour les boucles je reviens sur les foreach du début
    Merci beaucoup pour votre aide! Malheureusement, comme je vous l'ai dit, même si les boucles sont pas top top (lol) mon problème c'est surtout la requete à la fin et le return! Comment puis-je intégrer cette requete dans la boucle (car c'est elle qui contient $etatValidation en fait) pour que symfony me cherche les données et que chaque ligne ait une valeur de $etatValidation différente...(je le mets où ce return???)
    Je ne sais pas si c'est clair...

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    public function getAll($offset, $limit, array $filters = array(), array $sort = array(), array $params = array(), $query = null)
        {
    		$refFournisseur = $params['refFournisseur'];
    		$refOskar = $params['refOskar'];
    		$modele = $params['modele'];
    		$ajoutCommentaire = $params['ajoutCommentaire'];
     
    		//print_r($params);
     
    		//recuperer les effectivites validees
    		$tableEffectivitesValidees = Doctrine_Core::getTable('EffectivitesValidees');
    		$requete = $tableEffectivitesValidees->createQuery();
    		$requete->select('serie');
    		$requete->where('modele = ?', $modele);
    		$requete->andWhere('numArticle = ? OR numArticle = ?', array($refFournisseur, $refOskar));
    		$req1res = $requete->execute(array(), Doctrine::HYDRATE_SCALAR); 
     
    		//recuperer les series a comparer
    		$tableSeriesVehicule = Doctrine_Core::getTable('SeriesVehicule');
    		$requete2 = $tableSeriesVehicule->createQuery();
    		$requete2->select('serie');
    		$requete2->where('modele = ?', $modele);
    		$req2res = $requete2->execute(array(), Doctrine::HYDRATE_SCALAR); 
     
    		//comparer ici
    		$etatValidation = 0;
     
    		foreach($req1res as $serieVal){
    			foreach($req2res as $serieComp){
    				if($serieVal == $serieComp){
    					$etatValidation = 1;
    					//il faudrait alimenter chaque entrée ici avec la valeur de $etatValidation correspondante
    				}
    			}
    		}
    		//comparer ici FIN
     
    		//envoi des données à afficher
    		$query = $this->createQuery();
    		//du coup ici, la valeur d'état validation correpond à la dernière valeur en sortant des foreach, et c'est la même valeur pour toutes les entrées du coup!
    		$query->addSelect('\'' . $etatValidation . '\' as etatValidation, \'' . $refFournisseur . '\' as refFournisseur, \'' . $refOskar . '\' as refOskar, \'' . $ajoutCommentaire . '\' as ajoutCommentaire, *'); 
            $query->where('modele = ?', array($params['modele']));
     
    		return parent::getAll($offset, $limit, $filters, $sort, array(), $query);
        }
    Merci d'avance! Dites moi si je suis pas claire!

  5. #5
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Bonjour!
    J'ai laissé tomber ces trucs de symfony trop compliqués et je suis revenue vers TOAD pour faire des requetes. il se trouve que j'ai exactement la requete qu'il me faut il faut juste que je la traduise en doctrine (du coup, plus de boucles, plus de foreach, plus rien! Je vais chercher mes données à la source!)

    Voici ce que ça donne (il manque un GROS bout de la requete en doctrine) :
    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
    19
    20
    21
     
    public function getAll($offset, $limit, array $filters = array(), array $sort = array(), array $params = array(), $query = null)
        {
    		$refFournisseur = $params['refFournisseur'];
    		$refOskar = $params['refOskar'];
    		$modele = $params['modele'];
    		$ajoutCommentaire = $params['ajoutCommentaire'];
     
    //		SELECT '0' ETATVALIDATION, MODELE, SERIE 
    //		FROM NC2_SERIE_VEHICULE_OLD A
    //		where A.MODELE='LINE-S3'
    //		AND A.SERIE NOT IN (SELECT SERIE FROM SAD_EFFECTIVITES_VALIDEES where MODELE='LINE-S3' and NUMARTICLE='08934217E')
    //		UNION
    //		select '1' ETATVALIDATION, MODELE, SERIE from SAD_EFFECTIVITES_VALIDEES where MODELE='LINE-S3' and NUMARTICLE='08934217E'
     
    		$query = $this->createQuery();
    		$query->addSelect('\'0\' as etatValidation, \'' . $refFournisseur . '\' as refFournisseur, \'' . $refOskar . '\' as refOskar, \'' . $ajoutCommentaire . '\' as ajoutCommentaire, *');
    		$query->where('modele = ?', array($params['modele']));
     
    		return parent::getAll($offset, $limit, $filters, $sort, array(), $query);
        }
    J'en profite pour vous demander ici, pros de symfony, comment faire la jointure UNION. Parce que j'ai cherché et apparemment il faut modifier le fichier YAML pour pouvoir faire des jointures (donc apres il faut build:schema) mais j'ai pas vu d'exemple précis et surtout j'ai peur de faire des build et tout *$!# (pour etre polie).

    Merci et désolée encore, je sais que je suis une quiche!

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Je n'ai pas trouvé d'instruction UNION en DQL. Du coup, si tu en as vraiment besoin, tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $query = Doctrine_Manager::getInstance()->getCurrentConnection();
    $sql   = "SELECT etc. UNION etc." // ton SQL donc
     
    $collection = $query->execute($sql);
    Par contre, ça serait bien que tu puisses décrire quel est le besoin (et non comment tu le réalises) car ton code me paraît bien complexe alors qu'il y a surement une manière plus simple pour le réaliser.

  7. #7
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Je n'ai rien compris à ce que tu veux faire

    Par contre, sur la question des requêtes avec Doctrine :

    1 - Pour faire des jointures (inner/outer join), il faut en effet que le schema .yml soit correctement construit. Si tu ne sais pas à quoi cela correspond, demande à ton tuteur de te former là-dessus, c'est à peu près indispensable pour travailler avec Doctrine et Symfony en comprenant ce que l'on fait. Le tutorial Jobeet te donne également de bons points de départ.

    2 - Une JOINTURE est produit cartésien de deux tables, une UNION est une ... union. Pas le même opérateur , je te renvoie aux notions de base de la théorie des ensembles (ou de la logique booléenne). Donc l'UNION n'a rien à voir avec le schema .yml.

    3 - En outre, Doctrine n'implemente aucune méthode pour faire une union, mais cela n'est pas bien grave dans la mesure ou par définition de l'union, on n'en a pas vraiment besoin : une UNION est une addition de deux ensembles de résultats (de même structure). Pour la simuler avec Doctrine, fais deux requêtes sur la même table et rassemble les deux Doctrine_Collections ainsi obtenues.

    NB : cf. la méthode merge() de la classe Doctrine_Collection.
    NB bis : attention, merge() déduplique le tableau interne de ta Doctrine_Collection. C'est souvent ce que l'on souhaite, mais parfois cela surprend


    [EDIT @bilbonec : ha, on s'est croisés ^^ ]

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  2. Comparaison de deux tableaux
    Par tibss dans le forum Excel
    Réponses: 1
    Dernier message: 06/05/2009, 21h30
  3. Comparaison de deux tableaux en VB6
    Par taille50 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/08/2007, 10h28
  4. Comparaison de deux tableaux
    Par solorac dans le forum Excel
    Réponses: 7
    Dernier message: 03/08/2007, 08h49
  5. Comparaison de deux tableaux
    Par siaoly dans le forum Langage
    Réponses: 5
    Dernier message: 27/06/2006, 19h40

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