(PHP 5, PHP 7, PHP 8)
array_udiff — Computa a diferença de arrays usando uma função de callback para comparação dos dados
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.
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.
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.
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;
};
?>
Retorna um array contendo todos os valores de array
que não estão presentes em qualquer dos outros argumentos.
Exemplo #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 ) )
Exemplo #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.
Nota: Por favor note que esta função somente checa uma dimensão de um array n-dimensional. É claro que você pode checar dimensões mais profundas usando
array_udiff($array1[0], $array2[0], "data_compare_func");
.