J'ai 2 tableaux de données provenant de différentes sources de données dans différents formats, mais ils représentent les mêmes ressources. Donc id
dans l'un est le même que guid
dans l'autre par exemple.PHP array diff types différents
Actuellement, je convertis l'un des tableaux pour qu'il corresponde à l'autre, puis je les exécute via array_udiff
pour obtenir la différence.
Cependant, j'ai besoin de comparer 3 propriétés pour vérifier si elles correspondent, donc je ne peux pas retourner -1,0,1 car les 3 champs correspondent ou ne correspondent pas.
Si je retourne simplement -1 ou 0, il fonctionne à comparer $a
-$b
, mais ne parvient à comparer à $b
$a
$arr_a = [['id'=>1, 'a'=>1, 'b'=>0],['id'=>2, 'a'=>2, 'b'=>3],['id'=>3, 'a'=>1, 'b'=>0]];
$arr_b = [['id'=>3, 'a'=>1, 'b'=>0],['id'=>4, 'a'=>2, 'b'=>3],['id'=>5, 'a'=>1, 'b'=>0]];
function diff($a, $b) {
if(($a['id'] == $b['id'])
&& ($a['a'] == $b['a'])
&& ($a['b'] == $b['b'])
) {
return 0;
} else {
return -1;
}
$not_in_b = array_udiff($arr_a, $arr_b,'diff');
$not_in_a = array_udiff($arr_b, $arr_a,'diff');
print_r($not_in_b);
print_r($not_in_a);
Les rendements ci-dessus ...
Array
(
[0] => Array
(
[id] => 1
[a] => 1
[b] => 0
)
[1] => Array
(
[id] => 2
[a] => 2
[b] => 3
)
)
Array
(
[0] => Array
(
[id] => 3
[a] => 1
[b] => 0
)
[1] => Array
(
[id] => 4
[a] => 2
[b] => 3
)
[2] => Array
(
[id] => 5
[a] => 1
[b] => 0
)
)
Comme vous pouvez le voir le diff de $a
à $b
fonctionne, mais $b
à $a
ne ...
Comment puis-je comparer plusieurs Vaules comme celui-ci pour l'égalité ...
MISE À JOUR
Cela fonctionne, mais faire deux tableaux avec les trois valeurs de propriétés d'identification comme les clés ...
$arr_a = [['id'=>1, 'a'=>1, 'b'=>0],['id'=>2, 'a'=>2, 'b'=>3],['id'=>3, 'a'=>1, 'b'=>0]];
$arr_b = [['id'=>3, 'a'=>1, 'b'=>0],['id'=>4, 'a'=>2, 'b'=>3],['id'=>5, 'a'=>1, 'b'=>0]];
$arra_a_keys=[];
foreach($arr_a as $item) {
$arra_a_keys[$item['id'].'_'.$item['a'].'_'.$item['b']] = $item;
}
$arra_b_keys=[];
foreach($arr_b as $item) {
$arra_b_keys[$item['id'].'_'.$item['a'].'_'.$item['b']] = $item;
}
$not_in_b = array_diff_key($arra_a_keys, $arra_b_keys);
$not_in_a = array_diff_key($arra_b_keys, $arra_a_keys);
print_r($not_in_b);
print_r($not_in_a);
"ne fonctionnent pas". Montrez le code que vous avez essayé de toute façon et décrivez de quelle façon cela ne fonctionne pas. –
Quels sont les éléments qui comparent les critères? seulement 'id' et' guid' devraient correspondre? – sevavietl
@PatrickQ J'ai ajouté un exemple avec plus de détails ... –