(PHP 5, PHP 7, PHP 8)
array_udiff_uassoc — Veri ve indis karşılaştırması için bir geriçağırım işlevi kullanarak diziler arasındaki farkı indislerine de bakarak bulur
$dizi
,...$diziler
,$değer_karş_işlevi
,$anh_karş_işlevi
Veri ve indis karşılaştırması için bir geriçağırım işlevi kullanarak diziler arasındaki farkı indislerine de bakarak bulur.
Karşılaştırmada array_diff() ve array_udiff() işlevlerinden farklı olarak anahtarlar kullanılır.
dizi
İlk dizi.
diziler
Karşılaştırılacak diziler.
değer_karş_işlevi
Karşılaştırma işlevinin, ilk bileşeninin ikinci bileşenden küçük, eşit veya büyük olması durumunda sıfırdan küçük, eşit veya büyük bir tamsayı döndürmesi gerekir.
Karşılaştırma işlevinden float gibi
tamsayı olmayan değerlerin döndürülmesi, geri çağırım
işlevinin dönüş değerinin dahili olarak int türüne
dönüştürülmesiyle sonuçlanır. Bu nedenle 0.99
ve
0.1
gibi değerlerin her ikisi de 0
tamsayı değerine dönüştürüp bunlar eşit değerler olarak karşılaştırılacaktır.
Sıralama geri çağrısı, başlangıçta sağlandıkları sıraya bakılmaksızın, herhangi bir dizideki herhangi bir değeri herhangi bir sırada işlemelidir. Bunun nedeni, her bir dizinin diğer dizilerle karşılaştırılmadan önce ilk olarak sıralanmasıdır. Örneğin:
<?php
$arrayA = ["string", 1];
$arrayB = [["value" => 1]];
// $item1 ve $item2 "string", 1 veya [“value” => 1] seçeneklerinden herhangi biri olabilir
$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;
};
?>
anh_karş_işlevi
Anahtarları (indisleri) ayrıca karşılaştırmak için bu işlev kullanılır. Anahtarları karşılaştırmak için dahili bir işlev kullanan array_udiff_assoc() işlevinden farklı olarak bu işlev kullanıcı tanımlı bir işlev kullanır.
Diğer bağımsız değişkenlerin hiçbirinde mevcut olmayan tüm
dizi
değerlerini içeren bir dizi ile döner.
Örnek 1 - array_udiff_uassoc() örneği
<?php
class cr {
private $priv_member;
function __construct($val)
{
$this->priv_member = $val;
}
static function comp_func_cr($a, $b)
{
if ($a->priv_member === $b->priv_member) return 0;
return ($a->priv_member > $b->priv_member)? 1:-1;
}
static function comp_func_key($a, $b)
{
if ($a === $b) return 0;
return ($a > $b)? 1:-1;
}
}
$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23),
1 => new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3),
1 => new cr(4), 2 => new cr(-15),);
$result = array_udiff_uassoc($a, $b, array("cr", "comp_func_cr"),
array("cr", "comp_func_key"));
print_r($result);
?>
Yukarıdaki örneğin çıktısı:
Array ( [0.1] => cr Object ( [priv_member:private] => 9 ) [0.5] => cr Object ( [priv_member:private] => 12 ) [0] => cr Object ( [priv_member:private] => 23 ) )
Yukarıdaki örnekte gördüğünüz gibi "1" => new cr(4)
çifti her iki dizide de mevcut olduğundan çıktıda gözükmemektedir. 2
geriçağırım işlevi belirtmeyi unutmayın.
Bilginize: Bu işlevin bir n boyutlu dizinin tek bir boyutunu ele alacağına dikkat ediniz. Şüphesiz daha fazla sayıda boyutun hesaba katılmasını, örneğin
array_udiff_uassoc($dizi1[0], $dizi2[0], "veri_karş_işlevi", "anh_karş_işlevi");
gibi bir kullanımla sağlayabilirsiniz.