Position actuelle: Accueil> Derniers articles> Array_diff () peut-il gérer les tableaux d'objets?

Array_diff () peut-il gérer les tableaux d'objets?

M66 2025-05-14

Dans PHP, la fonction Array_Diff () est utilisée pour comparer deux tableaux ou plus, des éléments de retour qui existent dans le premier tableau mais pas dans d'autres tableaux. Habituellement, il est utilisé pour gérer les tableaux simples, mais le problème devient légèrement plus compliqué lorsque nous rencontrons des tableaux d'objets. Alors, array_diff () peut-il gérer les tableaux d'objets? Sinon, comment implémenter des fonctions similaires? Cet article le présentera en détail.

1. Utilisation de base de la fonction array_diff ()

L'utilisation de base de la fonction Array_Diff () consiste à comparer les éléments entre les tableaux et à renvoyer ceux qui n'apparaissent que dans le premier tableau. Sa signature de fonction est la suivante:

 array_diff(array $array1, array $array2, array ...$arrays): array

Cette fonction prend deux tableaux ou plus sous forme de paramètres et renvoie les éléments uniques dans le premier tableau. Voici un exemple simple:

 $array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];

$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [0] => 1
    [1] => 2
)

2. Array_diff () peut-il gérer les tableaux d'objets?

La fonction Array_Diff () fonctionne basée sur la "comparaison de valeur", ce qui signifie qu'il utilise l'opérateur == pour comparer les éléments dans un tableau. Pour les tableaux d'objets, array_diff () ne peut pas être comparé directement comme les tableaux normaux. Les objets sont des types de référence dans PHP, donc array_diff () les considère comme des objets différents même si les valeurs d'attribut des objets sont les mêmes.

Par exemple, supposons que nous ayons deux tableaux d'objets avec le même contenu, mais ce sont des instances d'objets différentes:

 class Person {
    public $name;
    public $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

$obj1 = new Person('John', 30);
$obj2 = new Person('John', 30);
$obj3 = new Person('Jane', 25);

$array1 = [$obj1, $obj2];
$array2 = [$obj2, $obj3];

$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [0] => Person Object
        (
            [name] => John
            [age] => 30
        )
)

Dans cet exemple, bien que les valeurs d'attribut de $ obj1 et $ obj2 soient les mêmes, array_diff () les considère différentes car ce sont des instances d'objet différentes, donc il renvoie $ obj1 sans renvoyer d'objet avec la même valeur d'attribut.

3. Comment utiliser array_diff () pour comparer les tableaux d'objets?

Pour comparer les tableaux d'objets à l'aide de Array_Diff () , nous pouvons résoudre ce problème en mettant en œuvre des règles de comparaison personnalisées. Une méthode courante consiste à utiliser la fonction array_map () pour convertir des objets en tableaux et comparer leurs valeurs d'attribut.

Voici une solution basée sur array_map () , qui se compare en convertissant les objets en tableaux d'attribut:

 class Person {
    public $name;
    public $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    // Se convertir en un tableau,Comparaison pratique
    public function toArray() {
        return ['name' => $this->name, 'age' => $this->age];
    }
}

$obj1 = new Person('John', 30);
$obj2 = new Person('John', 30);
$obj3 = new Person('Jane', 25);

$array1 = [$obj1, $obj2];
$array2 = [$obj2, $obj3];

// utiliserarray_map将对象Se convertir en un tableau
$array1 = array_map(function($obj) {
    return $obj->toArray();
}, $array1);

$array2 = array_map(function($obj) {
    return $obj->toArray();
}, $array2);

// utiliserarray_diffFaire une comparaison
$result = array_diff($array1, $array2);
print_r($result);

Sortir:

 Array
(
    [0] => Array
        (
            [name] => John
            [age] => 30
        )
)

Dans cet exemple, nous ajoutons une méthode toArray () à la classe de personne pour convertir les propriétés de l'objet en un tableau. Ensuite, utilisez array_map () pour convertir le tableau d'objets en un tableau d'attribut et utiliser array_diff () pour comparer. De cette façon, vous pouvez comparer les tableaux d'objets par valeur.

4. Conclusion

La fonction Array_Diff () ne peut pas traiter directement le tableau d'objets car il est basé sur des comparaisons de valeur, et les objets sont des types de référence en PHP. Si vous devez comparer les tableaux d'objets, vous pouvez convertir des objets en tableaux par des règles de conversion personnalisées et comparer leurs valeurs d'attribut. Les méthodes Array_Map () et ToArray () sont une solution courante.

De cette façon, nous pouvons comparer flexiblement les tableaux d'objets et implémenter des fonctions similaires à array_diff () .