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 :

[SOLVED] foreach et référence: modifier réellement un tableau à plusieurs dimensions


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Points : 94
    Points
    94
    Par défaut [SOLVED] foreach et référence: modifier réellement un tableau à plusieurs dimensions
    Bonjour,
    mon pb du jour, qui n'est pas bloquant, pcq j'ai trouvé une solution ...mais qui ne me semble pas propre (perte de temps de calcul inutile).
    est le suivant... je dois rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $result['players'][$key] =$array;
    pour conserver les modifications que j'ai faites dans array, alors que je pensais qu'elles se faisaient également dans le niveau du dessus... j'ai tenté de rajouté un passage par référence avec un & devant le array, mais ca n'a pas l'air d'être cela...
    y a t'il moyen d'éviter cette dernière ligne dans la déclaration du foreach? je rajoute la dimension 'board' qui n'existait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    foreach( $result['players'] as $key =>$array) { 	
    		$this->arrayColors[$array['colorid']]=$key;
    		$array['board']['nbsat'] = 0;	
    		$array['board']['eqp'] = array('NONE','NONE','NONE');	
      		$array['board'][2] = 0;
      		$array['board'][3] = 0;
    		$array['board'][5] = 0;
    		$array['board']['vobj'] = array();	
      		$array['board']['vsen'] = array();	
    		$array['board']['vspy'] = array();	
    		$this->log($array);
    		$result['players'][$key] =$array; 	
      	}

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    si le tableau "board" est le même pour tous les joueurs, tu pourrais par exemple l'extraire de la boucle
    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
     
    $arrayBoard = array();
     
    $arrayBoard['nbsat'] = 0;
    $arrayBoard['eqp'] = array('NONE','NONE','NONE');
    $arrayBoard[2] = 0;
    $arrayBoard[3] = 0;
    $arrayBoard[5] = 0;
    $arrayBoard['vobj'] = array();
    $arrayBoard['vsen'] = array();
    $arrayBoard['vspy'] = array();
     
     
    foreach($result['players'] as $key => $array) {
    	$this->arrayColors[$array['colorid']] = $key;
     
    	$result['players'][$key]["board"] = $arrayBoard;
    	$this->log($result['players'][$key]);
    }
    mais sinon je ne vois pas d'autre optimisation possible juste pour ce code.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    Ce n'est pas le cas
    mais je trouve cela curieux que ca ne soit pas possible d'enlever
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result['players'][$key]["board"] = $arrayBoard;
    en changeant la symbolique d'entrée pour que les opérations soient directement effectuées... un peu comme ci on utilisait le "with" d'autres langages.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach( $result['players'] as $key => &$array) {
    te permets de faire ce que tu veux. Teste sur un tableau plus simple et tu verras.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    malheureusement pour ce cas là, ce n'est pas le cas:

    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
     
    $sql = "SELECT player_id id, player_name name, player_color color,player_colorid colorid, player_score score FROM player ";
            $result['players'] = self::getCollectionFromDb( $sql );
    	//completed with extra datas deducted form cards position (here initiate defaults)
    	foreach( $result['players'] as $key =>$array) { 	
    		$this->arrayColors[$array['colorid']]=$key;
    		$array['board']['nbsat'] = 0;	
    		$array['board']['eqp'] = array('NONE','NONE','NONE');	
      		$array['board'][2] = 0;
      		$array['board'][3] = 0;
    		$array['board'][5] = 0;
    		$array['board']['vobj'] = array();	// victory objectives	
      		$array['board']['vsen'] = array();	// victory sentinels
    		$array['board']['vspy'] = array();	// victory opponents spy
    		$this->log('ICI',$result['players']);
    		$result['players'][$key] =$array; 
    		$this->log('LA',$result['players']);
      	}
    Les deux logs sont différents, le premier ne contient pas les modifs de Array.. le second les contient.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Tu as oublié l'esperluette devant $array.

    Et si tu l'as mis dans tes tests, bien évidemment tu ne vas pas logger cette variable en cours de boucle, ça te donnera une variable incomplète (et des redondances à chaque boucle). Vérifie la valeur de la variable après la boucle.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    tu veux dire faire comme cela?:
    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
     
    foreach( $result['players'] as $key =>&$array) { 	
    		$this->arrayColors[$array['colorid']]=$key;
    		$array['board']['nbsat'] = 0;	
    		$array['board']['eqp'] = array('NONE','NONE','NONE');	
      		$array['board'][2] = 0;
      		$array['board'][3] = 0;
    		$array['board'][5] = 0;
    		$array['board']['vobj'] = array();	// victory objectives	
      		$array['board']['vsen'] = array();	// victory sentinels
    		$array['board']['vspy'] = array();	// victory opponents spy
    		//$this->log('ICI',$result['players']);
    		//$result['players'][$key] =$array; 
    		//$this->log('LA',$result['players']);
      	}
    	$this->log('OULA',$result['players']);
    Si c'est le cas... par exemple le champs 'nbsat' n'existe pas.... la phrase $result['players'][$key] =$array; est nécessaire.
    (merci pour ton aide déjà )

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quelle est la structure de $result['players'] ?
    En testant un retour classique de base de donnée, j'ai bien le résultat attendu.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 155
    Points : 94
    Points
    94
    Par défaut
    J'ai tort.... "le &array" a bien fait son effet, j'ai pu supprimer le result=""
    Le fichier n'avait pas encore eu le temps d'être mis à jour quand j'ai retesté!

    merci!!!

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

Discussions similaires

  1. foreach sur un tableau à plusieurs dimensions
    Par Peanut dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2007, 14h04
  2. problème avec un tableau à plusieurs dimensions
    Par lelutin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 12h05
  3. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  4. Réponses: 7
    Dernier message: 19/01/2006, 18h57
  5. tableau à plusieurs dimensions
    Par pekka77 dans le forum C
    Réponses: 11
    Dernier message: 07/02/2005, 19h42

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