Position actuelle: Accueil> Derniers articles> Pourquoi les objets dans un tableau ne peuvent-ils pas être comptés?

Pourquoi les objets dans un tableau ne peuvent-ils pas être comptés?

M66 2025-06-07

PHP est un langage de programmation côté serveur largement utilisé qui fournit des capacités de traitement de tableau puissantes, où la fonction array_count_values ​​est une fonction très courante et utile. La fonction de la fonction array_count_values ​​consiste à compter la fréquence d'occurrence de tous les éléments dans le tableau. Il renvoie un tableau où la clé est l'élément du tableau d'origine et la valeur est le nombre d'occurrences de l'élément. Cependant, lorsque vous traitez des tableaux contenant des objets, vous pouvez rencontrer un comportement inattendu, ce qui entraîne des résultats statistiques inexacts, en particulier pour les tableaux d'objets.

1. Comment fonctionne la fonction array_count_values

La fonction de base de la fonction array_count_values ​​est d'itérer à travers le tableau et de compter le nombre d'occurrences de chaque élément, et le résultat est renvoyé sous la forme de paires de valeurs clés. Par exemple, supposons que nous ayons un tableau simple:

 $array = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana'];
$result = array_count_values($array);
print_r($result);

La sortie sera:

 Array
(
    [apple] => 2
    [banana] => 3
    [orange] => 1
)

Comme vous pouvez le voir, Array_count_values ​​compte correctement le nombre d'occurrences de chaque élément.

2. Pourquoi les objets dans un tableau provoquent-ils un comptage inexact?

Lorsque nous stockons des objets dans un tableau PHP, la fonction Array_count_values ​​peut ne pas se comporter comme prévu. En effet, les objets sont passés par référence, tandis que les objets en PHP sont comparés par leur adresse mémoire (pas leur valeur). Cela signifie que même si deux objets se ressemblent, leurs adresses de mémoire sont différentes et donc elles seront considérées comme des objets différents.

Regardons un exemple simple:

 class Fruit {
    public $name;
    public function __construct($name) {
        $this->name = $name;
    }
}

$apple1 = new Fruit('apple');
$apple2 = new Fruit('apple');

$array = [$apple1, $apple2, $apple1];
$result = array_count_values($array);
print_r($result);

Le résultat de la sortie est:

 Array
(
    Object(Fruit)#1 => 2
    Object(Fruit)#2 => 1
)

Bien que nous ayons deux objets Apple avec le même nom, car ce sont deux instances différentes (c'est-à-dire différentes adresses de mémoire), Array_count_values ​​les traite comme des éléments différents et les comptent séparément.

3. L'impact spécifique de l'array_count_values ​​et du tableau d'objets

Lorsque nous essayons de traiter un tableau contenant des objets à l'aide d'Array_count_values , il compte l'adresse mémoire de chaque objet, pas le contenu réel de l'objet. Cela peut entraîner les problèmes suivants:

  • Si vous avez plusieurs instances de l'objet avec le même contenu, elles seront considérées comme des termes différents, ce qui donne des résultats de comptage inexacts.

  • Si vous utilisez plusieurs instances d'objets de la même classe, Array_count_values ​​ne les traitera pas comme les mêmes éléments, même si les propriétés de ces objets sont exactement les mêmes.

4. Comment résoudre ce problème?

Afin de traiter correctement un tableau contenant des objets, les méthodes suivantes peuvent être prises:

  1. Réécrivez la méthode __tostring :

    Si l'objet a une représentation de chaîne unique (comme la valeur de propriété de l'objet), vous pouvez remplacer la méthode __tostring de l'objet pour convertir l'objet en chaîne, de sorte que Array_count_values ​​peut être compté en fonction de la chaîne.

     class Fruit {
        public $name;
        public function __construct($name) {
            $this->name = $name;
        }
        public function __toString() {
            return $this->name;
        }
    }
    
    $apple1 = new Fruit('apple');
    $apple2 = new Fruit('apple');
    $array = [$apple1, $apple2, $apple1];
    $result = array_count_values($array);
    print_r($result);
    

    Le résultat de la sortie sera:

     Array
    (
        [apple] => 3
    )
    

    Cela vous permet de compter correctement les objets du même nom.

  2. Utilisez Array_Map et sérialiser :

    Si vous souhaitez ne pas compter sur la méthode __tostring , vous pouvez utiliser Serialize pour convertir l'objet en une chaîne, puis utiliser array_count_values ​​pour compter.

     $array = [serialize($apple1), serialize($apple2), serialize($apple1)];
    $result = array_count_values($array);
    print_r($result);
    

    La sortie sera:

     Array
    (
        [O:6:"Fruit:..."] => 3
    )
    

    Dans cette méthode, nous convertissons l'objet en une chaîne unique en sérialisant , afin que Array_count_values ​​puisse calculer correctement le nombre de fois le même objet.

5. Résumé

Lorsque vous utilisez array_count_values ​​pour traiter un tableau contenant des objets, array_count_values ​​peut ne pas compter correctement les objets avec le même contenu car les objets sont comparés par des adresses mémoire. Ce problème peut être résolu efficacement en écrasant la méthode __tostring ou en utilisant la méthode de sérialisation , et Array_count_values ​​compte correctement les éléments dans le tableau d'objets.