gpt4 book ai didi

php - array_udiff 似乎不起作用

转载 作者:行者123 更新时间:2023-12-05 00:41:01 24 4
gpt4 key购买 nike

我正在尝试将两个数组与 array_udiff 进行比较,但这很奇怪。似乎 array_udiff 没有得到正确的答案。这里是 live demo .结果应该是一个空数组,但不过滤掉一个元素。

<?php

$string = '{
"sakiniai": [

{
"Faktas": "A",
"value": "true"
},
{
"Faktas": "B",
"value": "true"
},
{
"Faktas": "A",
"value": "false"
}
]
}';

$sakiniais = json_decode($string, true)['sakiniai'];


$v = $sakiniais[0];
$arr[] = $v;
$v['value'] = $v['value'] == "true" ? "false" : "true";
$arr[] = $v;
var_dump($arr);
var_dump($sakiniais);


print_r(array_udiff($arr, $sakiniais, function($a, $b){
/*
var_dump($a);
var_dump($b);
var_dump($a == $b);
echo "\n\n\n";
*/
return $a == $b ? 0 : -1;}
));

输出

    array(2) {
[0]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
[1]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
}
array(3) {
[0]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
[1]=>
array(2) {
["Faktas"]=>
string(1) "B"
["value"]=>
string(4) "true"
}
[2]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
}
Array
(
[1] => Array
(
[Faktas] => A
[value] => false
)

)

最佳答案

问题是 array_udiff 没有执行所有值之间的比较,这似乎是由您的比较函数引起的。

array_udiff() 期望可调用函数是一个真正的比较函数,但你总是返回 0 和 -1,而不是 1。

在完成其工作之前,array_udiff() 会尝试对两个数组进行排序并删除重复项。如果它不能依赖您的比较函数,它就不能执行所有需要的比较,并且某些值会被“跳跃”。

查看the documentation 中的所有评论特别是 napcoder 评论

Note that the compare function is used also internally, to order the arrays and choose which element compare against in the next round.

If your compare function is not really comparing (ie. returns 0 if elements are equals, 1 otherwise), you will receive an unexpected result.

这是通过查看您的数组来演示的

$arr

array(2) {
[0]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
[1]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
}

还有$sakiniais

array(3) {
[0]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
[1]=>
array(2) {
["Faktas"]=>
string(1) "B"
["value"]=>
string(4) "true"
}
[2]=>
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
}

您应该期望测试两个数组之间的所有组合,但测试的组合(如下)不包括 A-False 与 A-False

array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
bool(false)



array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
array(2) {
["Faktas"]=>
string(1) "B"
["value"]=>
string(4) "true"
}
bool(false)



array(2) {
["Faktas"]=>
string(1) "B"
["value"]=>
string(4) "true"
}
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
bool(false)



array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
bool(true)



array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(4) "true"
}
array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
bool(false)



array(2) {
["Faktas"]=>
string(1) "A"
["value"]=>
string(5) "false"
}
array(2) {
["Faktas"]=>
string(1) "B"
["value"]=>
string(4) "true"
}
bool(false)

this post 的正确答案中关于 array_udiff 的工作原理还有一些其他有用的见解

您可以像这样更改您的返回声明

if ($a < $b) {
return -1;
} elseif ($a > $b) {
return 1;
} else {
return 0;
}

(如果您想知道如何比较两个数组的大小,请查看 this link ,在“与各种类型的比较”部分和“示例#2 标准数组比较的转录”示例中)

关于php - array_udiff 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43998995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com