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 :

ARRAY - convertir les colonnes / lignes


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Points : 43
    Points
    43
    Par défaut ARRAY - convertir les colonnes / lignes
    bonjour

    Issu d'une requête dans une bdd je dois manupiler un array suivant pour mieux l'exploiter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    array(   
    [col_1] => A, B, C
    [col_2] => D, E
    [col_3] => F, G, H, I
    )
    Je voudrai obtenir le tableau suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    array(
    [row_1] => A, D, F
    [row_2] => B, E, G
    [row_3] => C, "", H
    [row_4] => "" , "", I
    )

    comme vous le devinez ... je dois "convertir " le premier tableau dont les clés représentent les valeurs de colonnes ( col 1 _2 _3 ) en lignes ( row _1 _2 _3 _4 )

    Les colonnes n'ont pas forcément le même nombre d'éléments ( 4 pour la col_3 et seulement 2 pour la col_2 ) ce qui me donne au final un nombre de lignes par forcément égal au nombre de colonne.

    Au final ... je doit mettre mon tableau initial sous forme d'un tableau "genre excel" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    col1    col2    col3
    ligne 1         A       D       F
    ligne 2         B       E       G
    ligne 3         C       -       -
    ligne 4         -       -       I
    z'avez une truc sympa ?
    je merdouille grave de mon coté .

    merci

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 131
    Points : 242
    Points
    242
    Par défaut tableau html
    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
    <?php
    $T = array(   
        'col_1' => ['A', 'B', 'C'],
        'col_2' => ['D', 'E'],
        'col_3' => ['F', 'G', 'H', 'I']
    );
     
    $count_rows = array_map('count', $T);
    rsort($count_rows);
    $count_rows = $count_rows[0];
    $cols = array_keys($T);
     
    echo '<table>';
    // colonnes
    echo '<tr>';
    echo '<td></td>';
    foreach ($cols as $col_name) echo '<td>', $col_name, '</td>';
    echo '</tr>', "\n";
     
    // lignes
    for ( $i=0; $i<$count_rows; $i ++) {
        echo '<tr>';
        echo '<td>Ligne ', ($i+1), '</td>';
        foreach ($T as $rows) {
            echo '<td>', (isset($rows[$i]) ? $rows[$i] : ''), '</td>';
        }
     
        echo '</tr>', "\n";
    }
    echo '</table>';

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    Ohhhhh ..merci +++
    ca marche très bien !

    j'ai regardé la doc de array_map ... je ne vois pas où tu as définit ta fonction "count" que tu passes en argument de array_map !
    est-ce une fonction standard interne a array_map ?

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

    @selmouadin
    +1

    on peut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $count_rows = array_map('count', $T);
    rsort($count_rows);
    $count_rows = $count_rows[0];
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $count_rows = max(array_map('count', $T)); // nombre MAX de colonnes
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            echo '<td>', (isset($rows[$i]) ? $rows[$i] : ''), '</td>';
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            echo '<td>', (isset($rows[$i]) ? $rows[$i] : '-'), '</td>'; // valeur, sinon "-" (tiret)
    (pour avoir les tirets)


    @french-petzouille

    la fonction count() existe en PHP.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    ah oui c'est encore plus joli...


    si je vous fait un print_r de mon array initial j'ai un aspect comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Array
    (
        [col_1] => 2,999,3
        [col_2] => 999,29,9
        [col_3] => 4,7,25
    )
    dans ce cas ... ca marche plus !
    doit falloir faire des trucs comme implode ou explode non ?

    en fait ...vos solutions sont OK si on a un array qui définit chaque colonne mais mon tableau initial est du genre :
    et non pas

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ce n'est pas ce que tu as donné comme "cahier des charges" dans ton 1er message...

    Donne-nous un exemple PLUS CONCRET (avec de "vraies" valeurs).

    ....Issu d'une requête dans une bdd....
    Montre-nous un exemple de requête SQL.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    merci pour ta réponse

    voila un exemple de ce qui est issu de la BDD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a:4:{s:5:"col_1";s:5:"5,7,7";s:5:"col_2";s:8:"999,29,5";s:5:"col_3";s:3:"9,3";s:5:"col_4";s:1:"5";}

    un rubrique texte qui contient un array serialisé

    que je reconverti en array pour traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Array
    (
        [col_1] => 5,7,7
        [col_2] => 999,29,5
        [col_3] => 9,3
        [col_4] => 5
    )

    merci

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    après des heures de reflexion ... j'ai fait un truc qui marche améliorable sans aucun doute et que voilà :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach ($col_1_2_3 as $d)
     {
            $r[]=mb_substr_count($d, ",");
    }
    # Nbre maxi de lignes a générer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$count_rows = max($r)+1;
    #RECUP NOM DES COLONNES
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        $cols = array_keys($col_1_2_3);
    Bouclage dans le tableau pour donner une même taille à tous les éléments via array_pad puis récupération via array_column

    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
     
    $i=1;
    foreach($cols as $c=>$nomCol)
    {
    		$t=array_pad(explode(',',$col_1_2_3['col_'.$i]),$count_rows,' - ' );
    		$z[]=$t;
    		$i++;
    }
     
    for ( $i=0; $i<$count_rows; $i ++) 
    {
      $x[]=array_column($z,$i);
    }
     
    foreach ($x as $c=>$arr)
    {
    echo '<tr>';
    foreach($arr as $c=>$v) echo '<td>', $v, '</td>';    
    echo '</tr>', "\n";
    }
    echo '</table>';
    merci à vous tous pour votre aide.

  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
    Salut

    une autre approche :
    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
    $data = [
        'col_1' => ['A', 'B', 'C'],
        'col_2' => ['D', 'E'],
        'col_3' => ['F', 'G', 'H', 'I']
    ];
     
    $nb_rows = max(array_map('count', $data));
     
    foreach ($data as $col => &$array) {
        for ($i = count($array) ; $i < $nb_rows ; ++$i) {
            $array[] = '';
        }
    }
     
    $pivot = [];
    foreach ($data as $col => $array) {
        $i = 0;
        foreach ($array as $k => $v) {
            $pivot[$i++][$col] = $v;
        }
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/05/2018, 15h08
  2. Requête SQL : Afficher les colonnes en ligne, et vice versa
    Par paflolo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/03/2009, 09h16
  3. Impossible de convertir les sauts de lignes \n en <br> dans une jsp.
    Par michaelcourcy dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 28/11/2006, 17h32
  4. Réponses: 1
    Dernier message: 25/08/2006, 19h01
  5. [VBA-E] Séparer les colonnes d'une listbox par des lignes?
    Par mulot03 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/05/2006, 14h03

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