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 :

Créer un index de noms avec césure par lettres [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Créer un index de noms avec césure par lettres
    Bonjour à tous,

    Je cherche à créer un index de noms par ordre alphabétique et je voudrais qu'à chaque changement de lettre, il y ait une césure avec la nouvelle lettre :

    A
    Abricot
    Amande
    ------
    B
    Banane
    ------
    C
    Carotte
    Chou
    etc...
    J'ai crée un tableau contenant les lettres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	function tabLettres(){
    		$alpha = array();
    		foreach(range('A','Z') as $i) {
    			$alpha[] = $i;
    		}
    		return $alpha;
    	}
    Puis mon tableau de noms, qui comporte aussi un id en clé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	function tabNoms(){
                    $sql = mysql_query("SELECT id, nom FROM table ORDER BY nom") or die(mysql_error());
    		$tab = array();
    		while($row = mysql_fetch_assoc($sql)){
    			$tab[$row['id']] = trim($row['nom']);
    		}
    		return sort($tab);
           }
    C'est donc dans la boucle qui parcourt ce tableau de noms que je voudrais créer des césures par initiales.
    Mais je ne vois pas trop comment articuler les deux. Mais peut-être que je n'aborde pas le truc par le bon angle.
    Merci de vos pistes et belle journée.

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2010
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 144
    Points : 241
    Points
    241
    Par défaut
    Je pense que ce genre de tableau répond au besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $index = array();
    $sql = mysql_query("SELECT id, nom FROM table ORDER BY nom") or die(mysql_error());
     
    while ($row = mysql_fetch_assoc($sql))
    {
      $index[strtoupper(substr($row['nom'], 0, 1))] = array($row['id'], $row['nom']);
    }
     
    var_dump($index);
    ?>
    Si toutes les lettres doivent figurer dans l'index même si aucun élement n'est présent il suffit de refaire la boucle "foreach (range('A', 'Z')" avant de faire la requête SQL

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour et merci de ta réponse.
    Le truc c'est que le tableau ne contient qu'une donnée par lettre et il y en a beaucoup...

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Le même en utilisant des sous-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
    <?php
    $index = array();
    $sql = mysql_query("SELECT id, nom FROM table ORDER BY nom") or die(mysql_error());
     
    while ($row = mysql_fetch_assoc($sql))
    {
      $index[strtoupper(substr($row['nom'], 0, 1))][$row['id']] = $row['nom'];
    }
     
    //affichage avec une liste
    echo '<ul>'
    foreach ($index as $lettre => $mots) {
        echo '<li>'.$lettre.' <ul> ';
        foreach ($mots as $id => $nom) {
            echo '<li>'.$nom.' ('.$id.') </li>';
        }
        echo '</ul></li>';
    }
    echo '</ul>';
    ?>

  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,

    à vrai dire la manière de traiter ce cas de figure va dépendre de la manière utilisée pour l'affichage :
    une approche parmi d'autres :
    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
    $data = array_fill_keys(range('A', 'Z'), array());
     
    $qry = mysql_query('SELECT id, TRIM(nom) AS nom FROM table ORDER BY TRIM(nom)') or die (mysql_error());
     
    while ($row = mysql_fetch_assoc($qry))
    {
        $fl = strtoupper(mb_substr($row['nom'], 0, 1)); // first letter
        $data[$fl][$row['id']] = $row['nom'];
    }
     
    // on insère la ligne de séparation comme une ligne de données quelconque
    foreach ($data as $alpha => &$list)
    {
        if ($alpha !== 'Z')
        {
            $list[] = '-----';
        }
    }
    Ensuite, il n'y a plus qu'à traiter le rendu...

  6. #6
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci à tous, c'est vraiment cool !
    Celira, ta soluce est parfaite pour moi :

    Je vous souhaite une belle fin de journée.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2010
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 144
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Bonjour et merci de ta réponse.
    Le truc c'est que le tableau ne contient qu'une donnée par lettre et il y en a beaucoup...
    Au temps pour moi, j'ai fais une faute, le code corrigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $index = array();
    $sql = mysql_query("SELECT id, nom FROM table ORDER BY nom") or die(mysql_error());
     
    while ($row = mysql_fetch_assoc($sql))
    {
      $index[strtoupper(substr($row['nom'], 0, 1))][] = array($row['id'], $row['nom']);
    }
     
    var_dump($index);
    ?>
    Ça revient quasiment au même que celui proposé par Celira...

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

Discussions similaires

  1. Liste déroulante avec affichage par lettres
    Par Naifman dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/12/2011, 09h49
  2. Onglet avec trie par Lettre alphabétique
    Par joebar0212 dans le forum 4D
    Réponses: 3
    Dernier message: 02/11/2010, 19h51
  3. [MySQL] Classement alphabétique avec séparation par lettres
    Par Overstone dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 23/05/2009, 22h03
  4. [MySQL] Créer des tableaux en PHP avec pour nom le resultat fournit par requête SQL
    Par arrakis75 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/01/2009, 13h49
  5. créer des handle de nom différents avec la même procédure
    Par yannickrohel dans le forum Windows
    Réponses: 4
    Dernier message: 11/02/2006, 13h59

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