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 :

Concatener 3 colonnes d'un array


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut Concatener 3 colonnes d'un array
    Bonjour à tous,

    J'ai un array de plusieurs lignes avec les colonnes suivantes :
    - nom
    - prenom
    - email
    - jour_naissance
    - mois_naissance
    - annee_naissance

    Et je voudrai avoir un tableau avec les colonnes suivantes :
    - nom
    - prenom
    - email
    - date_naissance (=jour_naissance/mois_naissance/annee_naissance)

    Je ne trouve pas comment faire, je me dis qu'il y a peut-être une fonction, où on met en paramètre les index des colonnes...

    Merci de votre aide.
    P.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Y'a pas une fonction magique pour tous les aspects de ton application, il faut se salir les mains parfois

    Bref, il suffit d'itérer
    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
    $data = array(
      array(
    	'nom' => 'foo',
    	'prenom' => 'bar',
    	'email' => 'foo.bar@domain.com',
    	'jour_naissance' => 23,
    	'mois_naissance' => 9, 
    	'annee_naissance' => 1987
      ),
      array(
    	'nom' => 'foo2', 
    	'prenom' => 'bar2', 
    	'email' => 'foo2.bar2@domain.com', 
    	'jour_naissance' => 8, 
    	'mois_naissance' => 11,  
    	'annee_naissance' => 1968
      ),
      array(
    	'nom' => 'foo3', 
    	'prenom' => 'bar3', 
    	'email' => 'foo3.bar3@domain.com', 
    	'jour_naissance' => 15, 
    	'mois_naissance' => 5,  
    	'annee_naissance' => 1995
      ),
    );
     
    foreach ($data as &$row) {
     	$row['date_naissance'] = "{$row['jour_naissance']}/{$row['mois_naissance']}/{$row['annee_naissance']}";
    	unset($row['jour_naissance'],$row['mois_naissance'],$row['annee_naissance']);
    }
     
    var_dump($data);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Génial !
    En fait je ne connaissais pas cette possibilité de concatener avec les "{...

    Et par contre comment faire si je ne veux pas que la nouvelle colonne créée soit en dernière position dans le tableau, mais plutôt en 2ème position.

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Citation Envoyé par Pierrick81 Voir le message
    Génial !
    En fait je ne connaissais pas cette possibilité de concatener avec les "{...

    Et par contre comment faire si je ne veux pas que la nouvelle colonne créée soit en dernière position dans le tableau, mais plutôt en 2ème position.
    Sur un tableau associatif l'ordre n'a aucune importance puisque tu accèdes aux colonnes via leur nom et non via un indice numerique.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Ok, mais en fait je veux l'exporter sous forme de fichier CSV, et je voudrai que les colonnes soient dans un certain ordre.

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Plusieurs solutions :

    Soit quand tu crée la ligne pour le csv tu place les arguments dans le bon sens :

    $csv = $tab['key5'].','.$tab['key1'] etc ...

    Soit tu créer un nouveau tableau au moment ou tu concatène tes colonnes.

    Soit tu tri le tableau existant avec uksort

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Voilà une solution envisageable (j'ai eu exactement le même problème donc j'ai crée une fonction helper)

    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
    /**
     * Reorders an associative array according to an ordered key list
     * @param array $values
     * @param array $order
     * @return array
     */
    if (!function_exists('array_reorder_keys')) {
        function array_reorder_keys (array $values, array $order) {
            $ret = array();
            foreach ($order as $key) {
                $ret[$key] = isset($values[$key]) ? $values[$key] : null;
        	}
        	return $ret;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // USAGE //
     
    // ordre b/c/a
    $a = array('b' => 1, 'c' => 2, 'a' => 3);
     
    var_dump($a);
     
    // mettre dans l'ordre a/b/c
    $b = array_reorder_keys($a, array('a','b','c'));
     
    var_dump($b);

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Merci pour ces conseils, mais en fait, j'ai un tableau qui a 'n' colonnes... ce 'n' n'est jamais fixe.
    Je sais juste que je veux mes 3 premières colonnes toujours identiques : Nom, prenom, date_naissance, mais ensuite je peux avoir 10 ou 20 autres colonnes en fonction de mes tableaux.
    Donc je cherchais à pouvoir dire prendra la colonne en dernière position, et la mettre en 3ème.
    Je vais y réfléchir calmement, car pour l'instant c'est déjà super d'avoir la date de naissance en entier, même à la fin :-)

    Merci à vous.

    P.

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Facile avec les opérations de tableaux:
    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
    // générer X tableaux de taille Y (ou X et Y sont compris entre 3 et 9)
    $rows = rand(3,9);
    $cols = rand(3,9);
    for ($i=0; $i<$rows; $i++) {
    	$values = range(97, 97+$cols);
    	$keys   = array_map('chr', $values);
    	shuffle($values);
    	shuffle($keys);
    	$data[] = array_combine($keys,$values);
    }
     
    var_dump('AVANT', $data);
     
    // mettre les 3 clés a, b et c toujours devant
    foreach ($data as &$row) {
    	// former une nouvelle ligne dont les trois premier éléments sont a, b et c
    	// et le reste des éléments (soit tous les autres paires moins a, b et c)
    	$row = (
    		array('a' => $row['a'], 'b' => $row['b'], 'c' => $row['c']) + 
    		array_diff_assoc($row, array('a' => '', 'b' => '', 'c' => ''))
    	);
    }
     
    var_dump('APRES', $data);

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Super, je n'ai même pas eu le temps de me mettre dessus, qu'en retour de réunion il y a la réponse... Merci !

    Par contre, cela fonctionne très bien sauf pour la première ligne du tableau qui contient le nom des colonnes...
    Cette ligne est totalement décalée et les 3 premières cases sont vides.

    Je ne comprends pas trop pourquoi.
    P.

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    ah bah oui, si l'énoncé est incomplet aussi...

    La ligne qui contiens les noms des colonnes doit être de la même structure associative que les lignes de données tout simplement. Tu peux la former à la main et la pousser en haut de la liste avec unshift.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Points : 53
    Points
    53
    Par défaut
    Effectivement, si je décompose bien, cela marche.
    En fait j'avais fait le unshift avant puis ta fonction, mais il devait y avoir un problème de structure.

    J'ai donc ajouté cela avant le unshift
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		$champ = (
    				array('nom' => 'nom', 'prenom' => 'prenom', 'date_naissance' => 'date_naissance') + 
    				array_diff_assoc($champ, array('nom', 'prenom'))
    			);
    Et voilà le travail.

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

Discussions similaires

  1. Concatenation de colonnes
    Par Nako_lito dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/06/2008, 09h06
  2. Concatener une colonne en une seule ligne.
    Par Contrec dans le forum Oracle
    Réponses: 3
    Dernier message: 12/10/2007, 08h51
  3. pb simple : concatenation de colonnes
    Par mike2302 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/06/2007, 10h33
  4. pb simple : concatenation de colonnes
    Par mike2302 dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/05/2007, 13h09
  5. Colonnes de type ARRAY
    Par darkdindon dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/03/2007, 01h04

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