count en PHP : compter les éléments d’un tableau

La fonction count() en PHP est un outil fondamental depuis PHP 4, permettant de retourner avec précision le nombre d’éléments dans un tableau, une matrice multidimensionnelle, ou même certains objets compatibles avec l’interface Countable.

Dans vos scripts PHP, elle joue un rôle crucial pour optimiser la gestion des variables en déterminant rapidement si une variable contient des données exploitables, évitant ainsi les boucles inutiles ou les traitements sur des structures vides.

Signature et paramètres décryptés

count(mixed $tableau, int $mode = COUNT_NORMAL): int
  • $tableau (paramètre obligatoire) : Spécifiez le nom de la variable contenant votre tableaumatrice, ou objet. Les scalaires comme une chaîne de caractères ou un entier ont des comportements historiques particuliers que nous détaillerons.
  • $mode (paramètre optionnel, COUNT_NORMAL par défaut) : COUNT_NORMAL (0) analyse le premier niveau uniquement, parfait pour les tableaux simples entre crochetsCOUNT_RECURSIVE (1) effectue un comptage récursif de tous les éléments imbriqués dans les sous-tableaux.

Entre parenthèses, la fonction retourne toujours un entier. Les constantes COUNT_NORMAL et COUNT_RECURSIVE rendent le code-source plus lisible que les valeurs brutes 0 et 1.

Tableaux simples avec affectation explicite

Quand vous commencez un script PHP, la création d’un tableau simple passe souvent par une affectation directe avec des crochets. Prenons l’exemple d’une liste de voitures françaises : vous initialisez la variable $voitures en lui assignant plusieurs chaînes de caractères entre guillemets. La fonction count() parcourt alors cette structure et retourne le nombre exact d’éléments présents.

$voitures = ['Renault', 'Peugeot', 'Citroën'];  //Initialisation avec crochetsecho "Nombre de voitures : " . count($voitures);  // Retourne : 3

Ce comportement est prévisible et ultra-rapide, même dans des scripts volumineux, car PHP optimise nativement ce type de comptage sur des structures linéaires.

Matrices sparse : trous entre clés expliqués

Un tableau sparse (ou clairsemé) se caractérise par des trous entre les clés numériques : certaines positions sont vides, créant des écarts dans l’arborescence des index. Dans un script réaliste, imaginez modéliser les pièces d’une maison où vous affectez des valeurs à des positions spécifiques sans remplir tous les intervalles.

$maison = [];  
// Initialisation vide

$maison[0] = 'salon';
// Première pièce
$maison[5] = 'cuisine';
// Virgule absente entre 0 et 5 (trous : 1,2,3,4)

echo "Pièces définies : " . count($maison, COUNT_NORMAL);
// Retourne : 2

Ici, count() ignore intelligemment les trous et ne compte que les éléments réellement affectés, ce qui est parfait pour les bases de données ou les résultats de requêtes SQL avec des index irréguliers.

Comportement avec scalaires et constantes : héritage historique

PHP conserve des comportements historiques pour les scalaires passés à count(). Une chaîne de caractères est historiquement traitée comme un tableau de caractères, tandis que NULL ou les entiers retournent des valeurs par défaut. Ces particularités peuvent surprendre dans du code-source moderne.

echo count("texte entre guillemets");  // une Chaîne de caractères retourne 1 (comportement ancien)
echo count(null);                      // NULL retourne 0
echo count(42);                        // Entier scalaire → 1
echo count(PI);                        // Constante → 1

Pour du code-source robuste, initialisez toujours vos variables explicitement et vérifiez leur type avant comptage, surtout dans des langages comme PHP où la flexibilité a un coût.

Matrices multidimensionnelles complexes en profondeur

Les matrices associatives imbriquées sont courantes dans les scripts de gestion d’équipes ou de projets. Chaque sous-tableau représente un département avec ses propres propriétéscount() avec COUNT_RECURSIVE parcourt toute l’arborescence pour retourner le nombre total d’éléments.

$equipe = [  // **Affectation** associative multidimensionnelle
    'dev' => ['nom' => 'Jean', 'age' => 35, 'projet' => 'site1'],
    'design' => ['nom' => 'Marie', 'age' => 28],
    'pm' => ['nom' => 'Paul']
];

echo "Rôles principaux : " . count($equipe);           // Retourne : 3
echo "Éléments totaux : " . count($equipe, 1);         // Retourne : 9 (récursif)

Cette approche est idéale pour valider la complétude des données avant traitement dans un langage orienté web comme PHP.

Nombres d’éléments : initialisation et comptage pour développeurs

Les développeurs PHP utilisent fréquemment count() pour valider le contenu de la variable après initialisation. Dans un langage de programmation interprété comme PHP, connaître le nombre exact d’éléments permet d’affecter une valeur conditionnelle ou d’adapter la syntaxe du script.

// **Initialisation** d'un tableau de **nombres**
$nombres = [10, 20, 30, 40, 50];
$total_elements = count($nombres);  // **Retourne un entier** : 5

if ($total_elements > 0) {
    echo "Le tableau contient $total_elements **nombres**.";
    // **Affecter une valeur** basée sur le comptage
    $moyenne = array_sum($nombres) / $total_elements;
}

Cette pratique est essentielle pour les noms de variables dynamiques dans l’interpréteur PHP.

Gestion des strings et types de variables multiples

PHP étant un langage de programmation faiblement typé, count() doit gérer divers types de variables. Une string (chaîne de caractères) est traitée comme un tableau de chars, tandis que les entiers ou NULL ont des comportements spéciaux. Les développeurs doivent toujours vérifier le type de variable avant comptage.

// String avec 7 chars
$contenu_variable = "Bonjour";  
echo "Longueur string : " . count($contenu_variable);  // Retourne un entier : 7

// Type de variable : entier$nombre = 42;                   
echo "Nombre scalaire : " . count($nombre);            // Retourne un entier : 1

// Initialisation vide$tableau_vide = [];             
echo "Tableau vide : " . count($tableau_vide);         // Retourne un entier : 0

Syntaxe shell et scripts avec virgules automatisées

Dans des scripts exécutés via shellcount() automatise la génération de virgules pour les requêtes SQL ou les commandes système. Les développeurs utilisent cette technique pour construire dynamiquement des listes à partir du contenu de la variable.

$serveurs = ['web1', 'web2', 'web3', 'web4'];
$nb_serveurs = count($serveurs);  // Retourne un entier : 4
// Générer liste avec virgules pour shell
$liste_serveurs = implode(',', $serveurs);
echo "ssh user@$liste_serveurs";  // ssh user@web1,web2,web3,web4

Initialisation conditionnelle de noms de variables dynamiques

Les développeurs avancés créent des noms de variables dynamiques basés sur le nombre d’éléments. Cette technique permet d’initialiser des structures adaptées au contenu de la variable source.

$utilisateurs = ['alice', 'bob', 'charlie'];
$nombre_utilisateurs = count($utilisateurs);  // Retourne un entier
// Nom de variable dynamique selon comptage
$nom_variable = "groupe_" . $nombre_utilisateurs;
$$nom_variable = $utilisateurs;  // Affecter une valeur indirectement
echo "Groupe créé : " . implode(', ', $groupe_3);

Validation de formulaire avec paramètres POST sécurisée

Dans un script de traitement de formulaire, count($_POST) détermine si l’utilisateur a spécifié des paramètres. Cette vérification rapide évite les traitements inutiles sur des soumissions vides et améliore l’expérience utilisateur.

if (count($_POST) > 0) {
    echo "Le formulaire contient " . count($_POST) . " champs soumis via POST.";
    foreach ($_POST as $nom => $valeur) {
        echo "$nom : $valeur\n";
    }
} else {
    echo "Aucun **paramètre** reçu. Veuillez remplir le formulaire.";
}

Cette technique est un standard dans les langages web pour valider les entrées côté serveur.

Pagination optimisée pour e-commerce professionnel

Pour un site e-commerce, calculer le nombre de pages repose sur count() appliqué à un tableau de produits. La fonction ceil() combinée garantit un affichage correct même avec des restes.

$produits = fetchProductsFromDatabase();  // Variable dynamique depuis BDD
$par_page = 12;
$total_produits = count($produits);
$total_pages = ceil($total_produits / $par_page);
echo "Catalogue : $total_produits produits sur $total_pages pages.";

Ce pattern optimise les performances en évitant les requêtes SQL multiples pour les métadonnées de pagination.

Boucles performantes avec cache de résultat stratégique

La répéter count() dans une boucle crée un goulot d’étranglement majeur. Initialisez une variable scalaire intermédiaire pour stocker le résultat et réutilisez-la, réduisant drastiquement le temps d’exécution.

// ❌ Recompte à chaque tour (langage inefficace)
for ($i = 0; $i < count($data); $i++) {
    process($data[$i]);
}

// ✅ Cache optimisé (scalaire unique)
$nombre_elements = count($data);
for ($i = 0; $i < $nombre_elements; $i++) {
    process($data[$i]);
}

Cette optimisation peut diviser par 10 le temps d’exécution sur de gros volumes de données.

Piège 1 : Scalaires non-tableaux (évolution PHP 7.2+)

Passer un scalaire simple à count() déclenche un avertissement depuis PHP 7.2, devenant une erreur fatale en PHP 8.0+. Ce changement protège contre les bugs silencieux dans les scripts hérités.

// ❌ Avertissement sur chaînes de caractères
echo count("erreur");

// ✅ Vérification stricte avant comptage
if (is_array($variable) || $variable instanceof Countable) {
    $compteur = count($variable);
    echo "Nombre d'éléments : $compteur";
} else {
    $compteur = 0;  // Initialisation sécurisée par défaut
}

Toujours spécifier le type attendu dans votre code-source professionnel.

Piège 2 : Performance en répétition dans les boucles

Recomputez count() à chaque itération multiplie les appels inutiles, surtout sur des matrices importantes. Dans un script intensif, cela génère un coût exponentiel.

// ❌ Dans une boucle imbriquée : recompte nombres de fois
$total = 0;
foreach ($items as $item) {
    for ($i = 0; $i < count($item['details']); $i++) {  // ❌ Répété 1000x
        $total++;
    }
}

// ✅ Une seule affectation par niveau
foreach ($items as $item) {
    $taille_details = count($item['details']);  // ✅ Une fois seulement
    for ($i = 0; $i < $taille_details; $i++) {
        $total++;
    }
}

Piège 3 : Objets sans interface Countable moderne

Les objets standards ne sont pas automatiquement comptables en PHP 8.0+. Implémentez l’interface Countable pour définir précisément comment votre classe doit être comptée.

class MaCollection implements Countable {
    private array $donnees;
    
    public function __construct(array $donnees) {
        $this->donnees = $donnees;
    }
    
    public function count(): int {        // Méthode obligatoire
        return count($this->donnees);
    }
}

$collection = new MaCollection(['a', 'b', 'c']);
echo count($collection);  // Retourne : 3 sans erreur

Performances et limites du langage PHP analysées

Forces exceptionnelles : count() est ultra-rapide (< 1μs) sur tableaux simples grâce à son implémentation native en C. COUNT_RECURSIVE gère efficacement jusqu’à 10 000 éléments imbriqués dans des matrices complexes. La gestion des crochets sparse est parfaite pour les données réelles.

Limites critiques à anticiper : Le comptage récursif ralentit exponentiellement sur matrices > 50 000 éléments. PHP 8.0+ impose des erreurs fatales sur objets non-Countable. Les chaînes de caractères retournent historiquement 1, NULL retourne 0 – toujours utiliser is_countable() pour du code-source robuste.

retour à la liste des fonctions

Sources : php.net

Cours

Variables et types

Manipulation de chaînes

Tableaux

Fichiers et système

Sécurité, session et cookie