Ce face array_udiff / array_uintersect și variantele lor
Funcțiile cu u („user”) primesc ca ultim parametru o funcție de comparare scrisă de tine. Funcția primește două valori și returnează 0 dacă le consideri egale, un număr negativ dacă prima este mai mică și unul pozitiv dacă este mai mare. Funcțiile PHP strcasecmp și operatorul <=> respectă deja această regulă.
array_udiff și array_uintersect compară doar valorile. array_udiff_assoc și array_uintersect_assoc cer în plus aceeași cheie (comparată normal). array_udiff_uassoc și array_uintersect_uassoc primesc două funcții: prima pentru valori, a doua pentru chei.
Parametri
| Parametru | Descriere |
|---|---|
$array |
Tabloul de pornire. |
$rest |
Unul sau mai multe tablouri, apoi funcția de comparare a valorilor (la variantele _uassoc, și funcția pentru chei). |
Ce returnează
Un tablou cu elementele din primul tablou care rămân după comparare, cu cheile originale.
Exemple
Exemplul 1: Fără să conteze majusculele
<?php
$abonati = ["Ana", "MIHAI", "ioana"];
$dezabonati = ["mihai", "IOANA"];
print_r(array_udiff($abonati, $dezabonati, "strcasecmp"));
print_r(array_uintersect($abonati, $dezabonati, "strcasecmp"));
Rezultat
Array
(
[0] => Ana
)
Array
(
[1] => MIHAI
[2] => ioana
)
Exemplul 2: Obiecte comparate după un câmp
<?php
$toate = [
["id" => 1, "titlu" => "PHP"],
["id" => 2, "titlu" => "MySQL"],
["id" => 3, "titlu" => "CSS"],
];
$citite = [["id" => 2], ["id" => 3]];
$necitite = array_udiff($toate, $citite, fn($a, $b) => $a["id"] <=> $b["id"]);
echo implode(", ", array_column($necitite, "titlu"));
Rezultat
PHP
Exemplul 3: Variantele _assoc: contează și cheia
Cu _assoc, cheile b și B sunt diferite. Cu _uassoc, cheile sunt comparate tot cu strcasecmp, deci devin egale.
<?php
$a = ["a" => "Roșu", "b" => "Verde"];
$b = ["a" => "roșu", "B" => "verde"];
print_r(array_udiff_assoc($a, $b, "strcasecmp"));
print_r(array_uintersect_assoc($a, $b, "strcasecmp"));
print_r(array_uintersect_uassoc($a, $b, "strcasecmp", "strcasecmp"));
Rezultat
Array
(
[b] => Verde
)
Array
(
[a] => Roșu
)
Array
(
[a] => Roșu
[b] => Verde
)
Greșeli frecvente
- Funcția de comparare returnează
true/falseîn loc de un număr negativ, 0 sau pozitiv. PHP sortează intern valorile cu ea și rezultatul devine greșit. Folosește<=>.
Comenzi înrudite
array_diff / array_diff_key / array_diff_assoc: Returnează elementele din primul tablou care nu apar în celelalte tablouri.array_intersect / array_intersect_key: Returnează elementele din primul tablou care apar și în toate celelalte tablouri.array_diff_ukey / array_intersect_ukey și variantele _uassoc: Diferența și intersecția tablourilor, cu o funcție proprie care compară cheile.