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] Copier un tableau contentant des sous tableaux


Sujet :

Langage PHP

  1. #1
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 365
    Points
    1 365
    Par défaut [Tableaux] Copier un tableau contentant des sous tableaux
    Bonjour,

    Je souhaite copier et transformer entièrement un tableau contentant des sous tableaux (un tableau à plusieurs dimensions).

    Ce que j'écris c'est :

    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
    // applatit, extractID: remplace dans l'array des résultats, les résultats par le seul ID
    function extractID(&$item, $key) {
    	$item=$item['idphoto'];
    	}
    function applatit($res) { // $res est passé par valeur
    	$res=$res;
    	if (is_array($res)) {
    		array_walk($res,'extractID');
    		return $res;
    		} else {
    		return null;
    		}
    	}
     
     
    $res2=applatit($res);
    $res2 est bien "applatit" mais $res aussi. Le problème se situe au niveau de la fonction applatit($res) qui, bien que prenant son paramètre par valeur, semble référencer les sous-tableaux au lieu de les recopier. Ceci m'est confirmé par la lecture des tuto sur php.net.

    Si le problème est identifié, sa solution ne l'est pas !!!!

    Comment donc copier un tableau en profondeur sans garder aucune référence au tableau d'origine ?

    Merci pour le coup de main.

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Pourquoi ne pas écrire une fonction de copie de tableau récursive ?

  3. #3
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Une solution qui me semble évidente (sous réserve), c'est de déclarer un tableau temoraire $resx dans ta fonction applati().

    Soit ma réponse est naze, soit tu as été étourdit

  4. #4
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Je n'avez pas oser proposer une technique récursive, mais comme notre commarade Gloupi le suggère et que je suis en plein dedans, je pense que la récursivité est bien adaptée.
    Bonne chance

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    La fonction récursive risque de pas être si simple que ça (rapport aux clés)...
    C'est facile si le tableau est indéxé par des nombres qui se suivant... dans le cas contraire, je sens que ça va bien compléxifier la chose...

  6. #6
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 365
    Points
    1 365
    Par défaut
    Pourquoi ne pas écrire une fonction de copie de tableau récursive ?
    Vous parlez d'un for($i=0;$i...) ou d'un système basé sur array_walk ?
    Je suis en train de me demander si j'ai pas "cherché midi à quatorze heures"

  7. #7
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    J'aurais bien tenté le défi, de la fonction récursive, mais je dois filler et en plus je suis au boulot.

    Je te recommande d'aller faire un tour là, ya de quoi bien te casser les neurones et aussi de quoi découvrir des techniques de programmations complexes mais efficaces (enfin selon moi).

    http://personal.vsnl.com/erwin/recursion.htm

  8. #8
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 365
    Points
    1 365
    Par défaut
    Voilà ce que j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function applatit($arr) { // $arr est passé par valeur
    	if (is_array($arr)) {
    		for($i=0;$i<count($arr);$i++) {
    			$arr[$i]=$arr[$i]['idphoto'];
    			}
    		return $arr;
    		} else {
    		return null;
    		}
    	}
     
    $res2=applati($res);
    et je ne comprends pas pourquoi ça ne marche pas.
    cela impacte $res. Pourquoi ?

    Quant à la récursivité, je préfère ne pas tenter tant que je comprends pas pourquoi cette nouvelle version ultra simplissime ne fonctionne pas !

    Je pensais avoir trouvé la solution mais là je comprends plus rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function applatit($arr) { // $arr est passé par valeur
    	if (is_array($arr)) {
    		for($i=0;$i<count($arr);$i++) {
    			$XXX[$i]="toto"; //$arr[$i]['idphoto'];
    			}
    		return $XXX;
    		} else {
    		return null;
    		}
    	}
    Ce code là aussi modifie la variable d'origine

    Laurent

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    JE ne saurais pas dire pourquoi ça ne marche pas, mais je saurais te proposer une solution récursive qui copie les éléments un a un (donc normalement, vrai copie, pas de ref)

    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
     
     
    function copy_tab($tab)
    {
        $tmp = array();
        foreach($tab as $val)
        {
             if(is_array($val))
                 $tmp[] = copy_tab($val);
             else
                 $tmp[]= $val;
        }
        return $tmp;
    }
     
    $new_tab = copy_tab($tab_a_copier);

  10. #10
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Je ne vois pas pourquoi ca ne marche pas ton truc, mais je te donne un conseil.

    Utilise foreach et/ou print_r($arr) pour mieux maitriser ton tableau, iil y a peut être un truc qui dérange le déroulement dans ton programme.

  11. #11
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 365
    Points
    1 365
    Par défaut
    Je ne sais pas si je dois en rire ou en pleurer mais rien n'y fait: CA NE MARCHE PAS

    J'ai suivi vos conseils sur la récursivité, que j'ai très légèrement adapté pour conserver les clés textuelles:

    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
    function applatit($arr) { // $arr est passé par valeur
    	if (is_array($arr)) {
    		// Je prends une copie d'arr
    		$XXX = copy_tab($arr);
    		// Je simplifie la copie
    		foreach($XXX as $k => $v) {
    			$XXX[$k]=$v['idphoto'];
    			}
     
    		print "<u>Applatit donne: </u>"; var_dump($XXX); print "<BR>\n";
     
    		return $XXX;
    		} else {
    		return null;
    		}
    	}
    function copy_tab($tab) {
        $tmp = array();
        foreach($tab as $key => $val) {
             if(is_array($val))
                 $tmp[$key] = copy_tab($val);
             else
                 $tmp[$key]= $val;
    	    }
        return $tmp;
        }
     
    // ------------------------
    applatit($res)
    A la sortie du applatit $res a changé sans raison visible.

    Toue aide est la bien venue.
    Merci.

    Laurent

  12. #12
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    910
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 910
    Points : 1 365
    Points
    1 365
    Par défaut
    En définitve...
    Je n'ai aps compris pourquoi php se comportait de la sorte.
    J'ai dû changer d'approche pour arriver à mes fins

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

Discussions similaires

  1. [Tableaux] Tri de tableau contenant des objets
    Par erehcab dans le forum Langage
    Réponses: 10
    Dernier message: 07/10/2008, 19h22
  2. Réponses: 2
    Dernier message: 21/03/2008, 15h41
  3. Réponses: 5
    Dernier message: 26/08/2006, 12h14
  4. [Tableaux] afficher un tableau et des données.
    Par suya95 dans le forum Langage
    Réponses: 3
    Dernier message: 13/06/2006, 21h12
  5. Réponses: 13
    Dernier message: 16/01/2006, 09h45

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