array_udiff / array_uintersect și variantele lor în PHP

Tablouri (array) PHP 5.0+

Diferența și intersecția tablourilor, cu o funcție proprie care compară valorile.

Sintaxă
array_udiff(array $array, ...$rest): array

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