array_udiff
(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
Descrição
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.
CautionRetornar 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
e0.1
serão convertidos para o valor inteiro0
, o que comparará esses valores como iguais.CautionA 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