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 :

[Tableaux] Modification d'un array dans un foreach puis affichage


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut [Tableaux] Modification d'un array dans un foreach puis affichage
    Bonjour à tous,

    Le post est un peu long, mais le problème est simple.

    Soit le tableau multidimensionnel suivant :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    Array
    (
        [categorie] => Array
            (
                [id_categorie] => 1
                [libelle_categorie] => Aliments
            )
     
        [articles] => Array
            (
                [0] => Array
                    (
                        [id_article] => 1
                        [nom_article] => Croquettes Frolic
                        [nom_photo] => frolic_1210028103_.jpg
                        [descrip_article] => Les meilleures croquettes du marché. Si votre chien ne mange plus beaucoup, ces croquettes pourraient bien lui redonner l''appétit.
                        [prix_article] => 29.9
                        [id_categorie] => 1
                        [libelle_categorie] => Aliments
                    )
     
                [1] => Array
                    (
                        [id_article] => 3
                        [nom_article] => Croquettes PROPLAN Housecat 3
                        [nom_photo] => croquette_3.jpg
                        [descrip_article] => Nutrition adaptée pour chat d''intérieur. Formulé avec une source naturelle d''inuline (racine de chicorée), pour réduire les odeurs de la litière. Riche en poulet et en riz.
                        [prix_article] => 30.45
                        [id_categorie] => 1
                        [libelle_categorie] => Aliments
                    )
     
                [2] => Array
                    (
                        [id_article] => 2
                        [nom_article] => Croquettes Royal Canin Labrador
                        [nom_photo] => croquette_2.jpg
                        [descrip_article] => Spécial chiens sportifs ! Régime hyperprotéique aidant votre chien a mieux récupérer de l''effort.
                        [prix_article] => 25.95
                        [id_categorie] => 1
                        [libelle_categorie] => Aliments
                    )
     
                [3] => Array
                    (
                        [id_article] => 5
                        [nom_article] => Prestige Premium grandes perruches
                        [nom_photo] => graines_oiseaux_1.jpg
                        [descrip_article] => Ce mélange de graines de qualité permet une alimentation équilibrée avec toutes les vitamines nécessaires. Cette nourriture aide à développer un superbe plumage, des couleurs éclatantes et naturelles tout au long de la vie de votre grande perruche.
                        [prix_article] => 8.95
                        [id_categorie] => 1
                        [libelle_categorie] => Aliments
                    )
     
                [4] => Array
                    (
                        [id_article] => 4
                        [nom_article] => Sheba Essensia
                        [nom_photo] => patee_1.jpg
                        [descrip_article] => Nourriture pour chat Sheba Essensia en sachet fraîcheur pratique, recette particulière avec des morceaux de viande délicieux. 6 x 85 g
                        [prix_article] => 4.5
                        [id_categorie] => 1
                        [libelle_categorie] => Aliments
                    )
     
            )
     
    )

    Il contient deux Array : le premier [categorie] et le second [articles].

    Celui qui nous intéresse ici est [articles]

    Le but est le suivant : si la valeur de la case ['desrip_article'] fait plus de 75 caractères, je veux couper cette valeur et ajouter '...'

    Exemple à plus petite échelle :
    Remplacer Il fait très beau ajourd'hui par Il fait très...

    Pour arriver à mes fins, je parcours [articles] dans un foreach, et je tronque si la longueur est trop grande :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach ( $donnees['articles'] as &$article )
    {
      // Si la description fait plus de 75 caractères, on tronque
      if ( strlen($article['descrip_article']) > 75 )
      {
        $article['descrip_article'] = substr($article['descrip_article'], 0, 75) . '...';
      }
    }

    Vous aurez remarqués le & devant &$article. Je l'utilise pour modifier directement mon tableau. Sans lui, la modification ne s'effectue pas.

    Après ce foreach, si je fais un print_r de mon tableau, les descriptions d'articles sont bien tronquées.

    Jusqu'ici tout va bien. Puis le problème étrange arrive...

    En effet lorsque je veux afficher mes articles, je reparcours mon tableau avec un foreach. Tout s'affiche correctement, sauf que l'avant dernier article du tableau est répété deux fois, et le dernier article n'apparaît pas (alors qu'il est bien là dans le print_r ! )

    Pour illustrer, admettons que l'on ait 4 articles A, B, C et D
    Le foreach d'affichage affiche A B C C (deux fois C)

    L'article étant bien là quand je fais un print_r, je ne comprends vraiment pas pourquoi le deuxième foreach ne "prend" pas cet article et répète 2 fois l'avant-dernier.

    Le code de l'affichage, tout bêtement :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach( $donnees['articles'] as $article )
    {
      echo($article['descrip_article']);
    }

    Un autre constat, si je tente d'afficher le contenu du tableau avec un & devant $article, tous les articles apparaissent bien.

    Alors, pourquoi le & est-il nécessaire dans le deuxième foreach, alors que je n'ai pas besoin d'accéder aux valeurs du tableau par référence ?

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Je ne vois pas pourquoi tu aurais un tel comportement
    Si tu veux un regard neuf sur le souci colle un script minimaliste et fonctionnel afin qu'on puisse reproduire le bug et faire des tests.

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Je reviens après qques recherche...
    Apparemment c'est un comportement normal. Explications trouvées ici : http://bugs.php.net/bug.php?id=29992

    [7 Oct 2004 9:12pm UTC] gardan at gmx dot de

    There is no corruption. It is easy to explain this behaviour. Take the
    following:

    $arr = array(1 => array(1, 2), 2 => array(1, 2), 3 => array(1, 2));
    foreach($arr as &$value) { }
    foreach(array(1,2,3,4,5) as $key => $value) { }
    echo $test[3];

    After the first foreach() loop what you have in $value is a reference to
    the last element in $arr (here: to array(1,2)).

    Now, when the next foreach loop assigns a value to $value, it assigns
    this value to where $value points, that is: to the last position of
    $arr. Now in the second foreach() the last item of $arr becomes first 1,
    then 2, etc and in the end, what you get as output by this program, is:

    5

    Not the expected:

    Array

    Now this is indeed very confusing if you don't know what's going on.

    Solution:
    unset $v before a new foreach() loop (maybe this could be done by php by
    default?)
    Le thème a été abordé de nbreuses fois sur bugs.php.net et à chq fois le ticket a été fermé par la team PHP.
    => Tout est normal

    Outre la solution proposée dans la citation collée, tu peux aussi modifier ton tableau en y accédant de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach ( $donnees['articles'] as $index => $article ) // Plus de &article
    {
      // Si la description fait plus de 75 caractères, on tronque
      if ( strlen($article['descrip_article']) > 75 )
      {
        $article['descrip_article'] = substr($article['descrip_article'], 0, 75) . '...';
        $donnees['articles'][$index] = $article ;
      }
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 93
    Points : 87
    Points
    87
    Par défaut
    Merci beaucoup pour ces deux réponses.

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

Discussions similaires

  1. Stockage commande grep dans une variable puis affichage
    Par Isabella83 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 23/04/2015, 11h13
  2. [Tableaux] copier tout un array dans une autre variable
    Par XavierWRC dans le forum Langage
    Réponses: 3
    Dernier message: 06/01/2010, 17h07
  3. Réponses: 2
    Dernier message: 28/03/2006, 11h45
  4. [Tableaux] Argument de type array dans __construct ??
    Par shadeoner dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2006, 20h03
  5. [Tableaux] Variable de type array dans un formulaire
    Par ThAOTh dans le forum Langage
    Réponses: 3
    Dernier message: 14/03/2006, 17h49

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