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 :

Comment pourrais-je éviter cette imbrication de boucles ? [PHP 5.1]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Comment pourrais-je éviter cette imbrication de boucles ?
    Bonjour,
    ne pouvant pas nettoyer la requête en amont, je me retrouve avec un tableau de tableaux du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $contacts=array (
        '001'=>array('nom'=>"", 'fixe'=>'040202020', 'mobile'=>....), 
        '002'=>array(...
    );
    pour ne garder que les éléments nécessaires à mon select, je nettoie avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($contacts as $a => $b){
        foreach($b as $c => $d){
            if($c!='nom' and $c!='fixe'and $c!='idgroupe'and $c!='contacts_id'){unset($contacts[$a][$c]);}
        }
    }
    j'ai essayé de faire plus concis avec key(), array_keys(), array_values() mais elles renvoient un tableau indexé
    foreach($contacts as $a => $b[$c]) n'est pas permis (désolé si ça pique les yeux)
    comment pourrais-je faire plus propre/court/rapide à votre avis ?
    merci de m'accorder le temps d'une réponse.

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Un code comme ça devrait être plutôt pas mal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $contacts = array_map(function($contact) {
        return array(
            'nom' => $contact['nom'],
            'prenom' => $contact['prenom']
        );
    }, $contacts);
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $keys = array_fill_keys(array('nom', 'fixe', 'mobile'), true);
    foreach ($contacts as &$v) {
        $v = array_intersect_key($v, $keys);
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    merci infiniment à vous deux, je gagne pratiquement 1 seconde à l'exécution ! (le second code semble plus rapide)

    afin d'alléger encore ce tableau (32Mo de RAM chez Free), je viens de remplacer l'index par l'id de l'enregistrement (contacts_id), sauf que dans mon select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<option title="'.$c['tel'].'" value="'.$c['contacts_id'].'" '.$selected.'>'.$c['nom'].'</option>';
    je patauge à récupérer la valeur numérique de $c['contacts_id'] : j'ai essayé current($contacts), key($contacts), current($c)... sans succès

    une dernière astuce si vous pouvez et je coche résolu
    encore merci.

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Quand tu boucles sur tes contacts, normalement ta clef contient ce que tu veux (si le remplacement que tu as dis avoir effectué est fait correctement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($contacts as $contacts_id => $contact) { //...
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    autant pour moi, var_dump() m'annonce que j'ai perdu mes index après un ordonnancement via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	foreach ($contacts as $key => $row) {
    			$ord1[$key]  = $row['idgroupe'];
    			$ord2[$key] = $row['nom'];
    		}
    		array_multisort($ord1, SORT_ASC, $ord2, SORT_ASC, $contacts ); //SORT_STRING SORT_NUMERIC SORT_DESC
    		unset($ord1);unset($ord2);
    je vais chercher une solution alternative de mon coté, je ne reviendrais vers vous qu'après avoir tout essayé
    encore merci.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Fais l’ordonnancement directement en SQL (c'est de très loin le plus performant) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM contacts ORDER BY idgroupe, nom

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Merci de votre aide, si j'étais en SQL, je demanderai uniquement les champs qui m'intéressent sans réduire mon tableau à postériori.
    Je pourrais même me payer le luxe de récupérer des requêtes sur ACCESS, voire celles sur Joomla1.5 (qui doit en être à la v5 depuis ?)

    Il se trouve que j'ai accroché avec un CMS qui vous économise la mise à jour du serveur SQL vu qu'il est basé sur un parsing de fichier XML : le valeureux PLUXML
    Vous pouvez y associer un plugin (spxDatas) qui fourni les classes pour requêter vos tables (un peu comme les CCK Flexicontent, K2 ou Jseblod sous Joomla) sauf que la fonction idoine collecte tous les champs, d'où ce thread.

    Une solution rapide pour les novices comme moi qui testent sur les pages persos sans s'angoisser avec les stats de G**gleAnalytics
    Bonne soirée les ingés et merci pour vos conseils.

    A toutes fin utiles, si quelqu'un a la même recherche que moi un jour :
    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
    $o["table"]="plantes";	
    $cultures = $plxShow->callHook('spxdatas::getData',$o);//select des plantes en culture
    	# trier les plantes "en culture" Et ayant un autre statut
    	foreach($cultures as $a => $b){
    		if( stristr($b['statut'], "002")==false){unset($cultures[$a]);}	
    	}
    	unset($a);unset($b);
    	//garde les champs utiles
    	$keys = array_fill_keys(array('genre', 'espece', 'variete','plantes_id' ), true);
    	foreach ($cultures as &$v) {
                $v = array_intersect_key($v, $keys);
             }
    	unset($v);unset($keys);
    	//met les champs dans l'ordre
    	foreach ($cultures as $a=>$b) { 
                  $ord1[$a]=$b['genre']; $ord2[$a]=$b['espece'];
            }
    	array_multisort($ord1, SORT_ASC, $ord2, SORT_ASC, $cultures ); 
    	unset($ord1); unset($ord2); unset($a); unset($b);
    	//réindexe		
    	foreach ($cultures as $a=>$b) {
               $new[$b['plantes_id']]=$b;
               unset($new[$b['plantes_id']]['plantes_id']);
            }
    	$cultures=$new;
    	unset($new);unset($a);unset($b);

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon j'ai regardé du côté de CMS XML et il semblerait que tu puisses faire l'ordonnancement dès le requêtage avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $o['order'] = "genre|A"
    Mais c'est limité qu'à une seule colonne

    Tu trouveras la source de cette fonctionnalité dans le fichier spxdatas.php ligne 1845 et suivantes

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Tout a fait, on retrouve aussi LIMIT, OFFSET ou FILTER comme en SQL, mais ils restent limités comme tu en fais la remarque.
    $o['filter'] accepte les 'and' mais ne peux discriminer une valeur dans un string ou un tableau, d'où mon stristr().
    je l'utilise surtout en "pré-filtrage" pour alléger mon résultat.

    Dans un esprit de partage, je pensais poster ici mon expérience avec PluXML, mais en y réfléchissant :
    1. je ne suis pas autant qualifié que son auteur pour en vanter les mérites, d'autant que leur forum est assez réactif
    2. tous les CMS XML se ressemblent, mon choix de celui-ci tient au plugin spxDatas qui me permet de transposer ma base perso (gros dump SQL->XML en cours)
    3. je suis à l'écran entre 2 bétonnières, 3 cuissons de céramique et 4 polymérisations (cet aprem

    Puisque l'honneur m'est fait de m'adresser au modo, je te laisse juge si cela peux être utile ici ?

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par chico83 Voir le message
    Puisque l'honneur m'est fait de m'adresser au modo, je te laisse juge si cela peux être utile ici ?
    Ici, probablement pas. Par contre il t'est tout à fait possible d'écrire un billet sur PLUXML sur ton blog DVP

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 15/09/2014, 10h46
  2. Comment pourrais-je avoir cette image en couleur ?
    Par nouha_79 dans le forum Images
    Réponses: 6
    Dernier message: 07/07/2007, 16h32
  3. comment résoudre un prbolème d'imbrication
    Par allowen dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 21/10/2005, 15h49
  4. Comment traduire en SQL cette condition?
    Par LESOLEIL dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/08/2005, 16h31
  5. Comment puis je faire cette effet...
    Par wikers dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/06/2004, 20h40

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