array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiffComputa a diferença de arrays usando uma função de callback para comparação dos dados

Descrição

array_udiff(array $array, array ...$arrays, callable $value_compare_func): array

Computa a diferença de arrays usando uma função de callback para comparação dos dados. Esta é contrária a array_diff() que usa uma função interna para comparar os dados.

Parâmetros

array

O primeiro array.

arrays

Arrays para comparar.

value_compare_func

A função de comparação deve retornar um inteiro menor que, igual ou maior que zero se o primeiro argumento for considerado respectivamente menor que, igual ou maior que o segundo.

callback(mixed $a, mixed $b): int
Caution

Retornar valores não inteiros da função de comparação, como float, resultará em uma conversão interna do valor retornado da função callback para int. Portanto, valores como 0.99 e 0.1 serão convertidos para o valor inteiro 0, o que comparará esses valores como iguais.

Caution

A função chamada de ordenação deve lidar com qualquer valor de qualquer array em qualquer ordem, independentemente da ordem em que eles foram originalmente fornecidos. O motivo é que cada array individual é primeiramente ordenado antes de ser comparado com outros arrays. Por exemplo:

<?php
$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 e $item2 podem ser "string", 1 ou ["value" => 1]
$compareFunc = static function ($item1, $item2) {
    $value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
    $value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
    return $value1 <=> $value2;
};
?>

Valor Retornado

Retorna um array contendo todos os valores de array que não estão presentes em qualquer dos outros argumentos.

Exemplos

Example #1 Exemplo de array_udiff() usando Objetos stdClass

<?php
// Arrays para comprar
$array1 = array(new stdClass, new stdClass,
                new stdClass, new stdClass,
               );

$array2 = array(
                new stdClass, new stdClass,
               );

// Define algumas propriedades para cada objeto
$array1[0]->largura = 11; $array1[0]->altura = 3;
$array1[1]->largura = 7;  $array1[1]->altura = 1;
$array1[2]->largura = 2;  $array1[2]->altura = 9;
$array1[3]->largura = 5;  $array1[3]->altura = 7;

$array2[0]->largura = 7;  $array2[0]->altura = 5;
$array2[1]->largura = 9;  $array2[1]->altura = 2;

function comparar_por_area($a, $b) {
    $areaA = $a->largura * $a->altura;
    $areaB = $b->largura * $b->altura;

    if ($areaA < $areaB) {
        return -1;
    } elseif ($areaA > $areaB) {
        return 1;
    } else {
        return 0;
    }
}

print_r(array_udiff($array1, $array2, 'comparar_por_area'));
?>

O exemplo acima produzirá:

Array
(
    [0] => stdClass Object
        (
            [largura] => 11
            [altura] => 3
        )

    [1] => stdClass Object
        (
            [largura] => 7
            [altura] => 1
        )

)

Example #2 Exemplo de array_udiff() usando Objetos DateTime

<?php
class MeuCalendario {
    public $livres = array();
    public $reservadas = array();

    public function __construct($semana = 'now') {
        $inicio = new DateTime($semana);
        $inicio->modify('Monday this week midnight');
        $fim = clone $inicio;
        $fim->modify('Friday this week midnight');
        $intervalo = new DateInterval('P1D');
        foreach (new DatePeriod($inicio, $intervalo, $fim) as $tempoLivre) {
            $this->livres[] = $tempoLivre;
        }
    }

    public function marcarCompromisso(DateTime $data, $nota) {
        $this->reservadas[] = array('data' => $data->modify('midnight'), 'nota' => $nota);
    }

    public function checarDisponibilidade() {
        return array_udiff($this->livres, $this->reservadas, array($this, 'compararPersonalizado'));
    }

    public function compararPersonalizado($livres, $reservadas) {
        if (is_array($livres)) $a = $livres['data'];
        else $a = $livres;
        if (is_array($reservadas)) $b = $reservadas['data'];
        else $b = $reservadas;
        if ($a == $b) {
            return 0;
        } elseif ($a > $b) {
            return 1;
        } else {
            return -1;
        }
    }
}

// Cria um calendário para compromissos semanais
$meuCalendario = new MeuCalendario;

// Marca alguns compromissos para esta semana
$meuCalendario->marcarCompromisso(new DateTime('Monday this week'), "Limpando apartamento do GoogleGuy.");
$meuCalendario->marcarCompromisso(new DateTime('Wednesday this week'), "Fazendo uma viagem de snowboarding.");
$meuCalendario->marcarCompromisso(new DateTime('Friday this week'), "Corrigindo código bugado.");

// Checar disponibilidade de dias comparando datas $reservadas com datas $livres
echo "Estou disponível nos seguintes dias desta semana...\n\n";
foreach ($meuCalendario->checarDisponibilidade() as $livre) {
    echo $livre->format('l'), "\n";
}
echo "\n\n";
echo "Estou ocupado(a) nos seguintes dias desta semana...\n\n";
foreach ($meuCalendario->reservadas as $reservada) {
    echo $reservada['data']->format('l'), ": ", $reservada['nota'], "\n";
}
?>

O exemplo acima produzirá:

Estou disponível nos seguintes dias desta semana...

Tuesday
Thursday


Estou ocupado(a) nos seguintes dias desta semana...

Monday: Limpando apartamento do GoogleGuy.
Wednesday: Fazendo uma viagem de snowboarding.
Friday: Corrigindo código bugado.

Notas

Note: Observe que esta função verifica somente uma dimensão de um array n-dimensional. É claro que dimensões mais profundas podem ser verificadas usando array_udiff($array1[0], $array2[0], "func_compara_dados");.

Veja Também

  • array_diff() - Computa as diferenças entre arrays
  • array_diff_assoc() - Computa a diferença entre arrays com checagem adicional de índice
  • array_diff_uassoc() - Computa a diferença entre arrays com checagem adicional de índice que feita por uma função de callback fornecida pelo usuário
  • array_udiff_assoc() - Computa a diferença entre arrays com verificação adicional de índice, comparando dados por uma função de retorno
  • array_udiff_uassoc() - Computa a diferença entre arrays com checagem adicional de índice, compara dados e índices por uma função de callback
  • array_intersect() - Calcula a interseção entre arrays
  • array_intersect_assoc() - Computa a interseção de arrays com uma adicional verificação de índice
  • array_uintersect() - Computa a interseção de array, comparando dados com uma função callback
  • array_uintersect_assoc() - Computa a interseção de arrays com checagem adicional de índice, compara os dados utilizando uma função de callback
  • array_uintersect_uassoc() - Computa a interseção de arrays com checagem adicional de índice, compara os dados e os índices utilizando funções de callback separadas