Aktueller Standort: Startseite> Neueste Artikel> Warum können Objekte in einem Array nicht gezählt werden?

Warum können Objekte in einem Array nicht gezählt werden?

M66 2025-06-07

PHP ist eine weit verbreitete serverseitige Programmiersprache, die leistungsstarke Array-Verarbeitungsfunktionen bietet, bei denen die Funktion array_count_values ​​eine sehr häufige und nützliche Funktion ist. Die Funktion der Funktion array_count_values ​​besteht darin, die Häufigkeit des Auftretens aller Elemente im Array zu zählen. Es gibt ein Array zurück, in dem der Schlüssel das Element im ursprünglichen Array ist und der Wert die Anzahl der Vorkommen des Elements ist. Wenn Sie jedoch mit Arrays mit Objekten befasst sind, können Sie jedoch auf ein unerwartetes Verhalten stoßen, was zu ungenauen statistischen Ergebnissen führt, insbesondere für Arrays von Objekten.

1. Wie die Funktion array_count_values ​​funktioniert

Die grundlegende Funktion der Funktion array_count_values ​​besteht darin, das Array durch das Array zu iterieren und die Anzahl der Vorkommen jedes Elements zu zählen, und das Ergebnis wird in Form von Schlüsselwertpaaren zurückgegeben. Angenommen, wir haben ein einfaches Array:

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

Die Ausgabe wird sein:

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

Wie Sie sehen können, zählt Array_Count_Values ​​die Anzahl der Vorkommen jedes Elements korrekt.

2. Warum verursachen Objekte in einem Array eine ungenaue Zählung?

Wenn wir Objekte in einem PHP -Array speichern, verhalten sich die Funktion array_count_values ​​möglicherweise nicht wie erwartet. Dies liegt daran, dass Objekte mit Referenz übergeben werden, während Objekte in PHP durch ihre Speicheradresse verglichen werden (nicht ihr Wert). Dies bedeutet, dass auch wenn zwei Objekte gleich aussehen, ihre Speicheradressen unterschiedlich sind und sie daher als verschiedene Objekte angesehen werden.

Schauen wir uns ein einfaches Beispiel an:

 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);

Das Ausgangsergebnis ist:

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

Obwohl wir zwei Apple -Objekte mit demselben Namen haben, da es sich um zwei verschiedene Instanzen (d. H. verschiedene Speicheradressen) handelt, behandelt Array_Count_Values ​​sie als unterschiedliche Elemente und zählt sie getrennt.

3. Die spezifischen Auswirkungen von Array_Count_Values ​​und Objektarray

Wenn wir versuchen, ein Array zu verarbeiten, das Objekte mit Array_Count_Values ​​enthält, zählt es die Speicheradresse jedes Objekts, nicht den tatsächlichen Inhalt des Objekts. Dies kann zu folgenden Problemen führen:

  • Wenn Sie mehrere Instanzen des Objekts mit demselben Inhalt haben, werden diese als unterschiedliche Begriffe gezählt, was zu ungenauen Zählernergebnissen führt.

  • Wenn Sie mehrere Objektinstanzen derselben Klasse verwenden, behandelt Array_Count_Values ​​sie nicht als dieselben Elemente, selbst wenn die Eigenschaften dieser Objekte genau gleich sind.

4. Wie kann man dieses Problem lösen?

Um ein Array mit Objekten korrekt zu verarbeiten, können die folgenden Methoden verwendet werden:

  1. Schreiben Sie die __toString -Methode neu :

    Wenn das Objekt eine eindeutige String -Darstellung hat (z. B. den Eigenschaftswert des Objekts), können Sie die __ToString -Methode des Objekts überschreiben, um das Objekt in eine Zeichenfolge umzuwandeln, damit array_count_values ​​basierend auf der Zeichenfolge gezählt werden kann.

     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);
    

    Das Ausgabeergebnis wird:

     Array
    (
        [apple] => 3
    )
    

    Auf diese Weise können Sie die gleichnamigen Objekte korrekt zählen.

  2. Verwenden Sie Array_Map und serialisieren :

    Wenn Sie sich nicht auf die __toString -Methode verlassen möchten, können Sie Serialize verwenden, um das Objekt in eine Zeichenfolge umzuwandeln und dann Array_Count_Values ​​zum Zählen zu verwenden.

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

    Die Ausgabe wird sein:

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

    In dieser Methode konvertieren wir das Objekt in eine eindeutige Zeichenfolge durch Serialize , damit Array_Count_Values ​​die Anzahl der Zeiten desselben Objekts korrekt berechnen kann.

5. Zusammenfassung

Wenn Sie Array_Count_Values ​​verwenden, um ein Array mit Objekten zu verarbeiten, zählt Array_Count_Values ​​möglicherweise nicht korrekt Objekte mit demselben Inhalt, da Objekte mit Speicheradressen verglichen werden. Dieses Problem kann effektiv gelöst werden, indem die __toString -Methode überschreiben oder die Serialize -Methode verwendet wird, und Array_Count_values ​​zählt die Elemente im Objektarray korrekt.