[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:
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:
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:
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 ?