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 :

Parcourir un tableau multidimentionnel


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Parcourir un tableau multidimentionnel
    Bonjour,

    Je possède un tableau multidimentionnel de la sorte :

    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
    Array
    (
        [0] => Array
            (
                [0] => Labrador
                [1] => Berger allemand
                [2] => Boxer
            )
     
        [1] => Array
            (
                [0] => Siamois
                [1] => Asian
                [2] => British shorthair
            )
     
        [2] => Array
            (
                [0] => Mini lop
                [1] => Californien
                [2] => Lapin néo-zélandais
                [3] => Hollandais            
            )
     
    )
    Je souhaite parcourir ce dernier de manière à afficher à chaque fois le premier élément de chaque sous tableau jusqu'à épuisement des sous tableaux, ensuite on recommence avec le deuxième élément de chaque sous tableau jusqu'à la fin etc etc.

    Ce qui donnerai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Labrador
    Siamois
    Mini lop
    Berger allemand
    Asian
    Californien
    Boxer
    British shorthair
    Lapin néo-zélandais
    Hollandais
    Je n'arrive pas à créer le parcours associé à cet affichage

    Merci pour votre aide

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    J'ai trouvé une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(count($mon_tableau) > 0) {
        foreach ($mon_tableau as $k => $v) {
            $k_current = key($v);
            $v_current = current($v);
            if($v_current) {                       
                echo $v_current.'<br />';
                unset($mon_tableau[$k][$k_current]);
            } else {
                unset($mon_tableau[$k]);
            }
        }
    }

  3. #3
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Pour la curiosité : c’est un problème d’aplatissement de tableau (en anglais, array flattening).

    D’un point de vue théorique, les tableaux sont des cas particulier de graphes. Il n’y a pas trente-six manières de les parcourir. Il existe deux catégories de solutions : le parcours en largeur et le parcours en profondeur. Ton problème, et donc ta solution, correspondent à un parcours en largeur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    une solution :
    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
    <?php
    // -------
    $array = [
    	['Labrador','Berger allemand','Boxer'],
    	['Siamois','Asian','British shorthair'],
    	['Mini lop','Californien','Lapin néo-zélandais','Hollandais']
    ];
    var_dump($array);
    // -------
    function get_liste( $array )
    {
    	$reverse = [];
    	foreach( $array as $arr )
    	{
    		foreach( $arr as $j => $val )
    		{
    			$reverse[$j][] = $val;
    		}
    	}
    	var_dump($reverse);
    	$liste = [];
    	foreach( $reverse as $arr )
    	{
    		foreach( $arr as $val )
    		{
    			$liste[] = $val;
    		}
    	}
    	$liste = implode('<br />', $liste);
    	return $liste;
    }
    // -------
    echo get_liste( $array );
    ?>
    $array (initial):
    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
    array (size=3)
      0 => 
        array (size=3)
          0 => string 'Labrador' (length=8)
          1 => string 'Berger allemand' (length=15)
          2 => string 'Boxer' (length=5)
      1 => 
        array (size=3)
          0 => string 'Siamois' (length=7)
          1 => string 'Asian' (length=5)
          2 => string 'British shorthair' (length=17)
      2 => 
        array (size=4)
          0 => string 'Mini lop' (length=8)
          1 => string 'Californien' (length=11)
          2 => string 'Lapin néo-zélandais' (length=21)
          3 => string 'Hollandais' (length=10)
    $reverse :
    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
    array (size=4)
      0 => 
        array (size=3)
          0 => string 'Labrador' (length=8)
          1 => string 'Siamois' (length=7)
          2 => string 'Mini lop' (length=8)
      1 => 
        array (size=3)
          0 => string 'Berger allemand' (length=15)
          1 => string 'Asian' (length=5)
          2 => string 'Californien' (length=11)
      2 => 
        array (size=3)
          0 => string 'Boxer' (length=5)
          1 => string 'British shorthair' (length=17)
          2 => string 'Lapin néo-zélandais' (length=21)
      3 => 
        array (size=1)
          0 => string 'Hollandais' (length=10)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Labrador
    Siamois
    Mini lop
    Berger allemand
    Asian
    Californien
    Boxer
    British shorthair
    Lapin néo-zélandais
    Hollandais

  5. #5
    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 : 48
    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,

    une autre soluce :
    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
    $data = [
        ['Labrador','Berger allemand','Boxer'],
        ['Siamois','Asian','British shorthair'],
        ['Mini lop','Californien','Lapin néo-zélandais','Hollandais']
    ];
     
    $nb_elem = max(array_map('count', $data));
     
    for ($i = 0 ; $i < $nb_elem ; ++$i) {
        for ($j = 0, $nb = count($data) ; $j < $nb ; ++$j) {
            if (isset($data[$j][$i])) {
                echo $data[$j][$i], '<br>';
            }
        }
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    Nouvelle solution :

    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
    <?php
    function get_liste2( $array )
    {
    	$count = count($array);
    	$liste = [];
    	foreach( $array as $i => $arr )
    	{
    		foreach( $arr as $j => $val )
    		{
    			$liste[$i+($j*$count)] = $val;
    		}
    	}
    	ksort($liste); // on met les clés dans l'ordre // (on obtient l'array des données dans l'ordre voulu)
    	$liste = implode('<br />',$liste);
    	return $liste;
    }
    // -------
    echo get_liste2( $array );
    ?>
    Dernière modification par Invité ; 15/11/2018 à 19h43.

  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 : 48
    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
    Quitte à partir dans du délire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ($i = 0 ; $i < max(array_map('count', $data)) ; ++$i) {
        array_walk_recursive($data, function($v, $k) use ($i) { echo $k === $i ? $v.'<br>' : ''; });
    }

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Avec array_column:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $animals = [
        ['Labrador', 'Berger allemand', 'Boxer'],
        ['Siamois', 'Asian', 'British shorthair'],
        ['Mini lop', 'Californien', 'Lapin néo-zélandais', 'Hollandais']
    ];
    $i = 0;
    while ( $col = array_column($animals, $i++) ) {
        echo implode("\n", $col) . "\n";
    }
    D'ailleurs autant utiliser une boucle for à la place de while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ($i = 0; $col = array_column($animals, $i++);) {
        echo implode("\n", $col) . "\n";
    }

  9. #9
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Quitte à partir dans du délire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $a = array
    (
        array('Labrador','Berger allemand','Boxer','Chincilla'),
        array('Siamois','Asian','British shorthair'),
        array('Mini lop','Californien','Lapin néo-zélandais','Hollandais','Fox terrier')
    );


    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    b:$i=0;$c=0;a: 
    if (isset($a[$i][0])) {
     echo array_shift($a[$i])."<br/>";
     $i++;
     if (isset($a[$i][0])) goto a; else goto b;  
    } 
    else {
     $c++;
     $i++;
    }
    if ($c != count($a)) goto a;

  10. #10
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Et puis pendant qu'on y est ...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    b:$i=0;$c=0;a: 
    if (isset($a[$i][0])) echo array_shift($a[$i])."<br/>"; else $c++;
    $i++;
    if ($c != count($a)) goto a; elseif ($c != $i) goto b;

Discussions similaires

  1. Parcourir un tableau?
    Par kanzarih dans le forum Oracle
    Réponses: 2
    Dernier message: 19/01/2006, 19h45
  2. Meilleure Méthode pour parcourir un tableau
    Par KPitN dans le forum MFC
    Réponses: 7
    Dernier message: 24/02/2005, 16h19
  3. Comment parcourir un tableau
    Par petitsims dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/01/2005, 14h33
  4. parcourir un tableau aléatoirement
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/12/2004, 13h44
  5. [langage] Parcourir un tableau
    Par Jibees dans le forum Langage
    Réponses: 13
    Dernier message: 22/04/2003, 14h18

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