1.5Tableaux & chaînes de caractères
Les tableaux (arrays) sont LA structure de données centrale de PHP — vous les manipulerez constamment. Un tableau est une COLLECTION de valeurs regroupées sous une même variable. Deux formes essentielles. Le tableau indexé : les éléments sont accessibles par un INDEX numérique (commençant à 0) — $fruits = ['pomme', 'banane', 'cerise'];, et $fruits[0] vaut 'pomme'. Le tableau associatif : les éléments sont accessibles par une CLÉ textuelle (au lieu d'un index) — $personne = ['nom' => 'Alice', 'age' => 30];, et $personne['nom'] vaut 'Alice'. Les tableaux associatifs sont omniprésents en PHP (ils représentent naturellement des données structurées : un utilisateur, une ligne de base de données, une configuration). Les tableaux peuvent aussi être multidimensionnels (des tableaux DANS des tableaux — par exemple une liste d'utilisateurs, chacun étant un tableau associatif). On parcourt un tableau avec foreach (section 1-3), on compte ses éléments avec count(), on ajoute avec $tableau[] = valeur;.
PHP fournit des CENTAINES de fonctions natives de tableaux et de chaînes qui font gagner un temps précieux — les connaître (ou savoir les chercher dans la documentation) est un réflexe essentiel. Pour les tableaux : count() (nombre d'éléments), array_push()/array_pop() (ajouter/retirer), in_array() (une valeur existe-t-elle ?), array_keys()/array_values(), sort()/usort() (trier), array_map() (transformer chaque élément), array_filter() (filtrer), array_reduce() (agréger), array_merge() (fusionner), implode() (tableau → chaîne) et explode() (chaîne → tableau)… Pour les chaînes de caractères : strlen() (longueur), str_replace() (remplacer), strpos() (position d'une sous-chaîne), substr() (extraire), trim() (enlever les espaces autour), strtolower()/strtoupper() (casse), ucfirst()/ucwords(), sprintf() (formater), str_contains() (PHP 8, contient une sous-chaîne ?)… Deux principes importants. D'abord, ne réinventez pas ce qui existe : avant d'écrire une boucle pour manipuler un tableau ou une chaîne, cherchez s'il existe une fonction native qui le fait (souvent oui, et plus efficacement). La documentation officielle de PHP est excellente et exhaustive — la consulter est un réflexe de développeur. Ensuite, un point de vigilance sur les chaînes et l'INTERNATIONAL : les fonctions de chaîne « classiques » (strlen, substr…) travaillent sur des OCTETS, ce qui pose problème avec les caractères accentués ou non-latins (encodés sur plusieurs octets en UTF-8) ; pour un traitement correct des caractères Unicode, on utilise les fonctions multi-octets (mb_strlen, mb_substr… — préfixe mb_). Un sujet à connaître dès qu'on manipule du texte multilingue. Maîtriser les tableaux (indexés, associatifs, multidimensionnels) et les fonctions de tableaux/chaînes est fondamental : c'est avec eux qu'on structure, stocke et manipule la quasi-totalité des données d'une application web — d'où leur place centrale dans PHP.
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]`.
- Tableau associatif
- Collection dont les éléments sont accessibles par une CLÉ textuelle : `$personne = ['nom' => 'Alice']; $personne['nom']`. Omniprésent (données structurées).
- Tableau multidimensionnel
- Tableaux DANS des tableaux (ex. une liste d'utilisateurs, chacun un tableau associatif) ; représente des données complexes.
- 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…).
- 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).
Quelle est LA structure de données centrale de PHP, et quel réflexe adopter pour la manipuler ?
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.
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_).
Questions fréquentes
Tableaux indexés ou associatifs : quand utiliser lequel, et comment bien les employer ?
Les tableaux indexés et associatifs répondent à des besoins différents, et bien choisir (et employer) rend le code plus clair et adapté — voici comment. La différence : (1) Tableau INDEXÉ : les éléments sont accessibles par un INDEX numérique automatique (0, 1, 2…). Il représente une SÉQUENCE, une LISTE d'éléments dont l'ordre compte mais qui n'ont pas de « nom » individuel. Exemple : $couleurs = ['rouge', 'vert', 'bleu']; — une liste de couleurs, accessibles par position ($couleurs[0]). (2) Tableau ASSOCIATIF : les éléments sont accessibles par une CLÉ textuelle qui a un SENS. Il représente des données STRUCTURÉES, un ensemble de propriétés nommées. Exemple : $utilisateur = ['nom' => 'Alice', 'email' => 'alice@ex.com', 'age' => 30]; — un utilisateur avec des propriétés nommées ($utilisateur['email']). Quand utiliser INDEXÉ : (1) Une LISTE d'éléments de même nature, sans nom individuel : une liste de produits, de couleurs, de nombres, de résultats. (2) Quand l'ORDRE compte et qu'on accède par position ou qu'on parcourt séquentiellement. (3) Quand vous COLLECTEZ des éléments (ajouter au fur et à mesure avec $tab[] = ...). Exemples : les résultats d'une recherche, une file d'attente, une liste de valeurs à traiter. Quand utiliser ASSOCIATIF : (1) Des données STRUCTURÉES avec des propriétés NOMMÉES : un utilisateur, un produit, une configuration, une ligne de base de données (chaque colonne devient une clé). (2) Quand chaque valeur a un RÔLE identifié par un nom (pas juste une position). (3) Quand vous voulez accéder aux valeurs par un identifiant parlant ($config['langue'] plutôt que $config[3]). Les tableaux associatifs sont TRÈS fréquents en PHP web, car les données du web sont structurées : $_POST (données de formulaire, clés = noms des champs), les résultats de base (clés = noms des colonnes), les configurations. La COMBINAISON (tableaux multidimensionnels) : très souvent, on combine les deux — un tableau INDEXÉ de tableaux ASSOCIATIFS. Exemple : une liste d'utilisateurs = un tableau indexé (la liste) dont chaque élément est un tableau associatif (un utilisateur avec ses propriétés). $utilisateurs = [ ['nom' => 'Alice', 'age' => 30], ['nom' => 'Bob', 'age' => 25] ];. C'est EXACTEMENT la forme des résultats d'une requête de base de données (une liste de lignes, chaque ligne un tableau associatif de colonnes) — d'où son omniprésence. On la parcourt avec foreach ($utilisateurs as $utilisateur) { echo $utilisateur['nom']; }. Comment bien les employer : (1) Choisissez selon la NATURE des données : liste homogène sans noms → indexé ; données structurées avec propriétés nommées → associatif. (2) Nommez les clés CLAIREMENT (associatif) : des clés parlantes ('dateNaissance') documentent les données. (3) Accédez sûrement : une clé absente provoque un avertissement/erreur ; vérifiez l'existence (isset($tab['cle'])) ou utilisez ?? ($tab['cle'] ?? valeurParDefaut) pour les clés potentiellement absentes (notamment les données de formulaire). (4) Parcourez avec foreach : foreach ($tab as $valeur) (indexé, ou associatif si les clés n'importent pas) ou foreach ($tab as $cle => $valeur) (associatif, pour utiliser les clés). (5) Utilisez les FONCTIONS de tableau adaptées (count, in_array, array_keys, array_map, array_filter…) plutôt que de tout faire à la main. (6) Pour des données très structurées et avec des COMPORTEMENTS, envisagez des OBJETS (niveau 3) plutôt que des tableaux associatifs — un objet Utilisateur avec des propriétés typées et des méthodes est souvent plus propre qu'un tableau associatif pour des entités importantes (les frameworks utilisent des objets/modèles). Mais les tableaux associatifs restent parfaits pour des données simples et flexibles. En résumé : tableaux INDEXÉS pour les LISTES (éléments de même nature, accès par position, ordre) ; tableaux ASSOCIATIFS pour les données STRUCTURÉES (propriétés nommées, accès par clé parlante — omniprésents en PHP web). Très souvent, on les COMBINE (liste indexée de tableaux associatifs — la forme des résultats de base). Employez-les selon la nature des données, avec des clés claires, un accès sûr (isset, ??), foreach pour parcourir, et les fonctions natives pour manipuler. Les tableaux (surtout associatifs et multidimensionnels) sont au cœur de la manipulation de données en PHP — les maîtriser est essentiel.
Pourquoi s'appuyer sur les fonctions natives de PHP plutôt que tout coder soi-même ?
S'appuyer sur les fonctions natives de PHP (au lieu de réinventer la roue) est un réflexe de développeur efficace : elles sont plus rapides à utiliser, plus fiables, plus performantes, et vous font gagner un temps considérable — voici pourquoi et comment. PHP possède des CENTAINES de fonctions natives (intégrées, disponibles sans rien installer) pour manipuler les chaînes, les tableaux, les dates, les fichiers, les mathématiques, et bien plus. Pourquoi les utiliser : (1) Gain de TEMPS. Pourquoi écrire une boucle de 10 lignes pour trouver si une valeur est dans un tableau, quand in_array() le fait en un appel ? Pourquoi coder un tri, quand sort()/usort() existent ? Pourquoi écrire une fonction pour mettre en majuscules, quand strtoupper() le fait ? Les fonctions natives couvrent les besoins COURANTS — les utiliser vous évite de réécrire ce qui existe, encore et encore. (2) FIABILITÉ. Les fonctions natives sont ÉPROUVÉES : testées par des millions d'usages, elles gèrent les cas limites correctement. Votre version « maison » d'une fonction de manipulation de chaîne ou de tableau aurait probablement des bugs (cas limites oubliés, erreurs) que la fonction native a déjà résolus. Utiliser le natif = code plus fiable. (3) PERFORMANCE. Les fonctions natives sont implémentées en C (le langage sous-jacent de PHP), donc RAPIDES — souvent bien plus qu'une implémentation équivalente en PHP pur (une boucle PHP). Pour manipuler de gros tableaux ou chaînes, les fonctions natives sont nettement plus performantes. (4) LISIBILITÉ. array_filter($users, fn($u) => $u['actif']) est plus clair et concis qu'une boucle qui construit un nouveau tableau. Le code utilisant des fonctions natives bien nommées est plus lisible (l'intention est explicite). (5) STANDARD. Les autres développeurs connaissent les fonctions natives — un code qui les utilise est plus facile à comprendre et à maintenir en équipe qu'un code plein de réimplémentations maison. Les catégories de fonctions natives à connaître : (1) Chaînes : strlen, str_replace, substr, strpos/str_contains, trim, strtolower/strtoupper, ucfirst, sprintf, explode/implode… (et leurs versions mb_ pour l'Unicode). (2) Tableaux : count, in_array, array_keys/array_values, array_map/array_filter/array_reduce, sort/usort, array_merge, array_search… (3) Dates : les fonctions et classes de date (section 2-4). (4) Mathématiques : abs, round, ceil, floor, min, max, rand… (5) Fichiers : lecture/écriture (section 2-3). (6) Filtrage/validation : filter_var (valider un email, une URL…). Et bien d'autres. Le RÉFLEXE à adopter : (1) AVANT d'écrire une boucle pour manipuler une chaîne ou un tableau, DEMANDEZ-VOUS « existe-t-il une fonction native qui fait ça ? ». Souvent, OUI. (2) CONSULTEZ la documentation officielle PHP (php.net) : elle est EXCELLENTE, exhaustive, avec des exemples pour chaque fonction. C'est LA ressource de référence — apprenez à la consulter (chercher une fonction, comprendre ses paramètres et son retour). C'est un réflexe de développeur professionnel. (3) Avec l'expérience, vous connaîtrez les fonctions courantes par cœur ; au début, cherchez et découvrez. Les nuances (quand coder soi-même) : (1) Pour une logique SPÉCIFIQUE à votre application (règle métier propre), vous écrirez évidemment votre code — les fonctions natives couvrent les manipulations GÉNÉRIQUES, pas votre logique métier. (2) Parfois, une fonction native ne fait pas exactement ce que vous voulez — vous la combinez avec d'autres, ou complétez. (3) Comprendre CE QUE fait une fonction native est important (ne pas l'utiliser en boîte noire aveugle) — lisez la doc pour bien l'employer. (4) Attention aux fonctions dépréciées/anciennes : privilégiez les fonctions modernes et sûres (par exemple, str_contains de PHP 8 plutôt que des astuces avec strpos). En résumé : appuyez-vous sur les fonctions natives de PHP plutôt que de tout coder vous-même, car elles vous font gagner du temps (ne pas réécrire l'existant), sont fiables (éprouvées, gèrent les cas limites), performantes (implémentées en C), lisibles (intention claire) et standard (connues de tous). Le réflexe : avant d'écrire une boucle de manipulation, chercher la fonction native (souvent elle existe) et consulter la documentation officielle (excellente). Réservez votre code à votre LOGIQUE MÉTIER spécifique. Ce réflexe (exploiter le natif, consulter la doc) est une marque d'efficacité et de professionnalisme — il vous fait écrire moins de code, plus fiable et plus rapide. « Ne réinventez pas la roue » est un principe universel en programmation, et PHP, avec sa riche bibliothèque native, vous offre énormément d'outils prêts à l'emploi : apprenez à les connaître et à les utiliser.