Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2008, 18h42   #1
Membre du Club
 
Inscription : avril 2007
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 93
Points : 61
Points : 61
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 :
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 :
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 :
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 ?
Christophe_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 19h02   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 835
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 835
Points : 3 468
Points : 3 468
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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 19h21   #3
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 835
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 835
Points : 3 468
Points : 3 468
Je reviens après qques recherche...
Apparemment c'est un comportement normal. Explications trouvées ici : http://bugs.php.net/bug.php?id=29992

Citation:
[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 :
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 ;
  }
}
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2008, 05h05   #4
Membre du Club
 
Inscription : avril 2007
Messages : 93
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 93
Points : 61
Points : 61
Merci beaucoup pour ces deux réponses.
Christophe_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h15.


 
 
 
 
Partenaires

Hébergement Web