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 :

nettoyer et réordonner un array (tableau)


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut nettoyer et réordonner un array (tableau)
    Bonjour,

    J'ai cet array :
    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
    $myArryDraft = [
        '0' => ['platform' => 'sea&ground'],
        '1' => [
            '0' => ['platform' => 'sea&ground'],
            '1' => [
                '0' => ['platform' => 'sea&ground'],
                '1' => ['date_platform' => '2021-08-02'],
            ],
            '2' => ['first_name' => 'jask'],
            '3' => ['last_name' => 'totoson'],
        ],
        '2' => [ 'environment' => 'meteo'],
        '3' => [ 'number' => '007'],
        '4' => [ 'other' => 'nothing'],
    ];
    J'aimerais bien le nettoyer en supprimant les informations redondantes et mettre en ordre comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $myArryUsableGood = [
        '0' => ['platform' => 'sea&ground'],
        '1' => ['date_platform' => '2021-08-02'],
        '2' => [ 'first_name' => 'jask'],
        '3' => [ 'last_name' => 'totoson'],
        '4' => [ 'environment' => 'meteo'],
        '5' => [ 'number' => '007'],
        '6' => [ 'other' => 'nothing'],
    ];
    voici ce que je fais, mais ce n'est pas une bonne solution épurée

    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
    $myArryUsable = [];
    foreach ($myArryDraft as $value) {
        if (!empty( $value['platform'])) {
            $myArryUsable [] = [
                "platform" => $value['platform'],
            ];
        }
        if (!empty( $value['environment'])) {
            $myArryUsable [] = [
                "environment" => $value['environment'],
            ];
        }
            // etc 
     
    }
    Alors vous pouvez m'aider ?

    en plus si je peux obtenir comme celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $myArryUsable = [ 
        'platform' => 'sea&ground',
        'date_platform' => '2021-08-02',
        'first_name' => 'jask',
         'environment' => 'meteo',
         'number' => '007',
         'other' => 'nothing',
    ];
    c'est encore mieux...

    Merci

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    c'est un bon exemple d'utilisation d'une fonction récursive :
    Code php : 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
    <?php
    $myArryDraft = [
        '0' => ['platform' => 'sea&ground'],
        '1' => [
            '0' => ['platform' => 'sea&ground'],
            '1' => [
                '0' => ['platform' => 'sea&ground'],
                '1' => ['date_platform' => '2021-08-02'],
            ],
            '2' => ['first_name' => 'jask'],
            '3' => ['last_name' => 'totoson'],
        ],
        '2' => [ 'environment' => 'meteo'],
        '3' => [ 'number' => '007'],
        '4' => [ 'other' => 'nothing'],
    ];
    ?>
    Code php : 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
    <?php
    // -------------
    function return_clean_array( $array, $return=[] )
    {
    	if( is_array($array) ) // on s'assure que c'est bien un tableau (array)
    	{
    		foreach ($array as $id => $val) 
    		{
    			if( is_array($val) ) // si $val est un tableau (array), on applique de nouveau la fonction ( -> récursivité)
    			{
    				$return = return_clean_array( $val, $return );
    			} 
    			else // sinon, on enregistre les couples $id / $val
    			{ 
    				$return[$id] = $val;
    			}
    		}
    	}
    	return array_unique( $return ); // on supprime les doublons
    }
    // -------------
    $myArryUsable = return_clean_array( $myArryDraft, [] );
    ?>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<pre>'; print_r( $myArryUsable ); echo '</pre>';
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Array
    (
        [platform] => sea&ground
        [date_platform] => 2021-08-02
        [first_name] => jask
        [last_name] => totoson
        [environment] => meteo
        [number] => 007
        [other] => nothing
    )

  3. #3
    Membre éclairé
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Par défaut
    C'est génial, jreaux62 ...

    Je ne savais pas comment on peut appliquer (et même je ne sais pas du toi ce que c'est ) la fonction récursive.
    En plus, je ne savais pas excitant la fonction dPHP : array_unique


    Un grand merci

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    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 994
    Par défaut
    Je pars du principe que lorsqu' une clef est en plusieurs exemplaires la valeur correspondante est toujours la même (comme dans l'exemple).

    Tu peux utiliser array_walk_recursive qui a l'avantage de ne visiter que les "feuilles" de l'arbre formé par le tableau multidimensionnel et pas ses "branches".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $result = [];
     
    array_walk_recursive($draft, function($v, $k) use (&$result) {
        $result[$k] = $v;
    });

  5. #5
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 994
    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 994
    Par défaut
    Une autre possibilité est d'exploiter les itérateurs de la SPL (Standard PHP Library: cette bibliothèque n'a pas besoin d'être installée et ses outils sont disponibles dans toute installation de PHP par défaut).

    "Itérateur" est un terme générique qui désigne un objet sur lequel on peut "itérer" (ce qui est une très vilaine explication). Du point de vue POO, cela signifie que la classe dont provient l'objet implémente l'interface Iterator qui impose que les méthodes next(), current(), key(), valid() et rewind() soient présentes. Donc concrètement si $iter est un itérateur, on peut boucler dessus comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( $iter->valid() ) {
        echo $iter->key(), " : ", $iter->current(), "\n";
        $iter->next();
    }
    (en admettant que la valeur de l'item soit affichable avec echo).

    Par exemple la SPL fournit la classe ArrayIterator qui permet d'obtenir un itérateur à partir d'un tableau (ou de n'importe quel type d'objet qui aurait les mêmes caractéristiques).

    En soit ce n"est pas la panacée vue qu'il y a déjà pas mal de fonctions pour faire tout et n'importe quoi avec les tableaux, par contre la classe RecursiveArrayIterator est déjà plus intéressante car pour chaque item elle peut renvoyer un nouvel itérateur lorsque l'item en question est un tableau via sa méthode getChildren() (l'itérateur sera aussi une instance de RecursiveArrayIterator). Avec cette caractéristique, il devient alors possible d'explorer les profondeurs d'un tableau multidimensionnel en passant d'un itérateur à l'autre.

    Mais passer d'un itérateur à l'autre c'est fastidieux, car pour chaque item il faut vérifier si c'est un tableau (avec la méthode hasChildren()) puis si c'est bien le cas il faudra boucler dessus puis recommencer pour le tableau suivant etc. etc. etc., ce qui oblige soit à écrire une fonction récursive, soit à écrire une boucle qui surveille le niveau de profondeur avec une pile.
    Heureusement, les concepteurs de la SPL dans leur infinie sagesse ont justement prévu le coup en permettant de passer d'un itérateur à un autre de manière transparente. Il existe donc pour ce faire, un itérateur d'itérateurs récursifs appelé sobrement: RecursiveIteratorIterator.

    Comme il se trouve que cette classe dispose d'une option pour que l'itérateur ne renvoye que les feuilles (RecursiveIteratorIterator::LEAVES_ONLY) pendant son petit parcours, et que cette option est activée par défaut, cela nous donne pour ce qui nous intéresse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $result = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($draft));
    $result = iterator_to_array($result);

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

Discussions similaires

  1. [Procedure stockee] Passer en parametre une array / tableau
    Par Baltak dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 14/12/2011, 16h30
  2. Probleme avec un public array/tableau de strings
    Par Nico820 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2011, 13h04
  3. Valeur de retour d'une proc = ARRAY tableau
    Par hermellin dans le forum AS/400
    Réponses: 5
    Dernier message: 27/01/2011, 00h12
  4. Réponses: 2
    Dernier message: 11/01/2010, 13h39
  5. Comment nettoyer une colonne sur un tableau
    Par Tinien dans le forum Excel
    Réponses: 1
    Dernier message: 30/09/2008, 18h00

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