1.5Tableaux & chaînes de caractères
L'essentiel en 30 secondes
- Indexé = liste, associatif = données nommées : $tab[0] par position, $tab['nom'] par clé — choisir selon la nature.
- Multidimensionnel = la forme du web : liste de lignes associatives — exactement un résultat de requête, parcouru en foreach.
- Ne pas réinventer : count, in_array, array_map/filter, implode/explode, str_replace, trim… — et mb_* pour l'Unicode.
Mini-cas filé — Riad structure ses données à Constantine
Riad reçoit la liste des prestations avec leurs tarifs : il les stocke d'abord dans des variables séparées $p1, $p2, $p3 — et s'emmêle dès la quatrième. Il restructure en tableau associatif par prestation, puis en liste multidimensionnelle prête pour l'affichage en foreach. Il remplace sa boucle maison de recherche par in_array, son comptage manuel par count, et corrige un strlen qui coupait un intitulé accentué en passant à mb_strlen. Ses données ont enfin une forme qui grandit sans casser.
Dernier épisode du cas 1.1-1.4 — Riad structure ses données après les variables, les décisions, les boucles et les fonctions.
1. Les tableaux, structure centrale
Les tableaux sont LA structure de données de PHP. Le tableau indexé : accès par index numérique (à partir de 0) — $fruits = ['pomme', 'banane']; $fruits[0]. Le tableau associatif : accès par une clé textuelle — $personne = ['nom' => 'Alice']; $personne['nom'] (omniprésent : données structurées). Les tableaux peuvent être multidimensionnels (tableaux dans des tableaux — ex. une liste d'utilisateurs). On les parcourt avec foreach, on compte avec count(), on ajoute avec $tab[] = valeur;.
Riad range ses prestations en liste d'associatifs (nom + tarif chacun) : ajouter une prestation, c'est ajouter une ligne — plus jamais une variable $p4.
2. Fonctions natives & Unicode
PHP a des centaines de fonctions natives. Tableaux : count, in_array, array_map (transformer), array_filter (filtrer), array_reduce (agréger), implode / explode. Chaînes : strlen, str_replace, substr, trim, str_contains (PHP 8). Réflexe : ne pas réinventer ce qui existe (la doc officielle est excellente). Vigilance Unicode : les fonctions classiques travaillent sur des OCTETS (problème avec les accents en UTF-8) — utiliser les fonctions multi-octets (mb_strlen, mb_substr).
Riad compte avec count, cherche avec in_array, et mesure ses intitulés accentués avec mb_strlen : trois boucles maison supprimées, un affichage corrigé.
🔎 Exemple concret — 🔎 Exemple concret — Indexé, associatif, multidimensionnel
La forme des données web, comme Riad pour ses prestations.
$utilisateurs = [
['nom' => 'Alice', 'age' => 30],
['nom' => 'Bob', 'age' => 25],
];
foreach ($utilisateurs as $u) {
echo htmlspecialchars($u['nom']) . ' ';
}
echo count($utilisateurs); // 2
Lecture : exactement la forme d'un résultat de requête (liste de lignes), parcourue en foreach.
Leçon : accès sûr aux clés avec ?? ($tab['cle'] ?? défaut) — jamais de clé absente surprise.
Vocabulaire de la section
- Tableau indexé
- Collection dont les éléments sont accessibles par un INDEX numérique (à partir de 0) : $fruits = ['pomme', 'banane']; $fruits[0].
Exemple simple : La liste des noms de prestations de Riad.
Ce que ce n'est pas : un associatif pour une simple liste ordonnée.
Réflexe : liste homogène, ordre qui compte = indexé.
- Tableau associatif
- Collection dont les éléments sont accessibles par une CLÉ textuelle : $personne = ['nom' => 'Alice']; $personne['nom']. Omniprésent (données structurées).
Exemple simple : Chaque prestation de Riad (nom + tarif nommés).
Ce que ce n'est pas : $prestation[1] au lieu de $prestation['tarif'].
Réflexe : données nommées = clés explicites.
- Tableau multidimensionnel
- Tableaux DANS des tableaux (ex. une liste d'utilisateurs, chacun un tableau associatif) ; représente des données complexes.
Exemple simple : Le catalogue complet de Riad, listé puis affiché.
Ce que ce n'est pas : des variables $p1, $p2, $p3 séparées.
Réflexe : liste d'entités = indexé d'associatifs.
- Fonctions de tableaux/chaînes
- Centaines de fonctions natives : tableaux (count, in_array, array_map/filter/reduce, sort, implode/explode…), chaînes (strlen, str_replace, substr, trim, str_contains…).
Exemple simple : Le count et l'in_array qui remplacent les boucles maison de Riad.
Ce que ce n'est pas : une boucle manuelle pour chercher une valeur.
Réflexe : avant une boucle : la native existe-t-elle ?
- Fonctions multi-octets (mb_)
- Pour traiter correctement l'Unicode (caractères accentués/non-latins) : mb_strlen, mb_substr… ; les fonctions classiques travaillent sur des octets (problème en UTF-8).
Exemple simple : L'intitulé accentué de Riad mesuré en mb_strlen.
Ce que ce n'est pas : tronquer « référencement » avec substr et couper un caractère.
Réflexe : texte accentué = mb_* systématique.
En pratique — En pratique — Manipuler tableaux et chaînes
- Créez un tableau indexé et un tableau associatif ; accédez à leurs éléments (par index / par clé) et ajoutez un élément (`$tab[] = ...`).
- Créez un tableau multidimensionnel (ex. une liste d'utilisateurs, chacun un tableau associatif) et parcourez-le avec foreach.
- Utilisez des fonctions de tableaux : count, in_array, array_map (transformer), array_filter (filtrer), implode/explode.
- Manipulez des chaînes : strlen, str_replace, substr, trim, strtolower ; et repérez les fonctions multi-octets (mb_strlen) pour l'Unicode.
Script prêt à dire — défendre la fonction native (30 s)
« Avant d'écrire cette boucle, vérifions s'il existe une native : in_array cherche, array_filter filtre, implode assemble — éprouvées, rapides, lisibles. On réserve notre code à la logique métier, pas à réécrire ce que PHP fait déjà. »
À dire en revue de code ; ouvrir php.net sur la fonction candidate.
Modèle copier-coller — catalogue multidimensionnel + natives + mb_*
'Vitrine', 'tarif' => 10000],
['nom' => 'Boutique', 'tarif' => 25000],
];
$catalogue[] = ['nom' => 'Sur mesure', 'tarif' => 50000];
echo count($catalogue); // 3
foreach ($catalogue as $prestation) {
echo htmlspecialchars($prestation['nom']) . ' : ' . $prestation['tarif'] . "\n";
}
$tarifs = array_column($catalogue, 'tarif');
echo in_array(25000, $tarifs) ? 'Tarif present' : 'Absent';
echo mb_strlen('Référencement'); // compte juste les accentues
Catalogue à Constantine
Comme Riad : liste d'associatifs nom/tarif — l'affichage en foreach suit la forme exacte d'un futur résultat de base.
Clé peut-être absente
$prestation['promo'] ?? 'aucune' : l'accès sûr évite l'avertissement quand une ligne n'a pas la clé.
Recherche ou filtre
in_array pour « existe ? », array_filter pour « lesquels ? » — deux natives au lieu de deux boucles maison.
Texte accentué
Intitulés en français oblige : mb_strlen/mb_substr pour mesurer et tronquer sans couper un caractère accentué.
✓ Bonnes pratiques
- Choisir indexé (liste) ou associatif (données nommées) selon la nature des données.
- Accéder sûrement aux clés (isset, ?? pour les clés absentes).
- Chercher une fonction native avant d'écrire une boucle.
✗ Pièges fréquents
- Accéder à une clé absente sans vérifier (avertissement/erreur).
- Traiter du texte accentué avec strlen/substr (octets) au lieu de mb_*.
- Réécrire à la main ce qu'une fonction native fait mieux.
Points clés à retenir
- Les TABLEAUX sont LA structure centrale de PHP : INDEXÉS (index numérique, `$tab[0]`), ASSOCIATIFS (clé textuelle, `$tab['nom']`, omniprésents), MULTIDIMENSIONNELS (tableaux dans tableaux).
- PHP a des CENTAINES de fonctions natives : tableaux (count, in_array, array_map/filter/reduce, sort, implode/explode) et chaînes (strlen, str_replace, substr, trim, str_contains).
- RÉFLEXE : ne pas réinventer ce qui existe — avant d'écrire une boucle, chercher la fonction native (souvent plus efficace). La doc officielle PHP est excellente, la consulter.
- Attention à l'UNICODE : les fonctions classiques (strlen, substr) travaillent sur des OCTETS (problème avec les accents/caractères non-latins en UTF-8) ; utiliser les fonctions MULTI-OCTETS (mb_*).
Défi 48h — appliquez demain
Restructurez des variables séparées en tableau (modèle ci-dessus) : remplacez une boucle maison par count/in_array/array_filter et un strlen sur texte accentué par mb_strlen. Vérifiez l'affichage. 25 minutes suffisent.
- Je choisis indexé, associatif ou multidimensionnel selon les données.
- J'utilise les natives (count, in_array, array_map/filter, implode/explode).
- Je traite l'Unicode en mb_* et j'accède aux clés en ?? sûr.
Questions fréquentes
Tableaux indexés ou associatifs : quand utiliser lequel, et comment bien les employer ?
Tableau INDEXÉ : accès par index numérique — représente une LISTE d'éléments de même nature (`$couleurs = ['rouge', 'vert', 'bleu']`), quand l'ordre compte ou qu'on collecte (`$tab[] = ...`). Tableau ASSOCIATIF : accès par CLÉ textuelle qui a un sens — représente des données STRUCTURÉES (`$utilisateur = ['nom' => 'Alice', ...]`), pour une entité (utilisateur, produit, ligne de base). Très fréquent en PHP web (`$_POST`, résultats de base). La COMBINAISON (multidimensionnel) est omniprésente : un INDEXÉ d'ASSOCIATIFS = une liste d'entités, exactement un résultat de requête, parcourue avec foreach. Bonnes pratiques : choisir selon la nature, nommer les clés clairement, accéder sûrement (isset, `??`), parcourir avec foreach.
Pourquoi s'appuyer sur les fonctions natives de PHP plutôt que tout coder soi-même ?
GAIN DE TEMPS (in_array en un appel vs une boucle), FIABILITÉ (éprouvées par des millions d'usages, cas limites gérés), PERFORMANCE (implémentées en C, rapides), LISIBILITÉ (`array_filter($users, ...)` dit l'intention), STANDARD (connues de tous). Catégories : chaînes, tableaux, dates, maths, fichiers, validation. Le réflexe : AVANT d'écrire une boucle, demander « existe-t-il une native ? » et consulter php.net. Réservez votre code à votre LOGIQUE MÉTIER.
Quelle est la structure de données centrale de PHP ?