关于php array_diff_ukey() 函数的疑惑

新手上路,请多包涵

代码

<?php
function myfunction($a,$b)
{
    return 0;
//  return 1;
//  return -1;
//   if ($a===$b)
//   {
//      return 0;
//   }
//   return ($a>$b)?1:-1;
}

$a1=array("a"=>"red","b"=>"green","c"=>"blue");
$a2=array("a"=>"red","b"=>"green","d"=>"blue");
$a3=array("e"=>"yellow","a"=>"red","d"=>"blue");

$result=array_diff_uassoc($a1,$a2,$a3,"myfunction");
print_r($result);
?>

问题:

return 0; 结果:Array
(

[b] => green
[c] => blue

)
return 非0;结果:Array
(

[a] => red
[b] => green
[c] => blue

)
根据array_diff_ukey我分析是 自定义函数 返回 0 则输出该值 返回1 则不输出

<?php
function myfunction($a,$b)
{
// return 1; // Array([a] => red;[b] => green;[c] => blue)
return 0; // Array()
// if ($a===$b)
// {
// return 0;
// }
// return ($a>$b)?1:-1;
}

$a1=array("a"=>"red","b"=>"green","c"=>"blue");
$a2=array("a"=>"blue","b"=>"black","e"=>"blue");

$result=array_diff_ukey($a1,$a2,"myfunction");
print_r($result);
?>

但是这是什么情况???

求指点

阅读 1.2k
1 个回答

这个问题很好,其实这里涉及到php查找算法。两个函数都是使用自定义函数比较数组的键名,取差集。如果给两个不重复元素的两个数组,查找在第一个数组出现且不在第二个数组出现的元素。php的比较过程是分别取两个数组的第一个元素,如果相同,则第一个数组下标往前移动,如果不同,则保存第一个数组元素,第二个数组下标往前移动。

基于这样的处理方式

function myfunction($a,$b)
{
  return 0;
}

$a1=array("a"=>"red","b"=>"green","c"=>"blue");
$a2=array("a"=>"red","b"=>"green","d"=>"blue");
$result=array_diff_ukey($a1,$a2,"myfunction");//输出结果array("b"=>"green","c"=>"blue");

实际上比较的过程是[a-a,b-a,c-a],因为键名比较自定义函数中返回0,认为都是一样的,比较过程导致比较键值是

if($a1['a']!=$a2['a']){
输出$a1['a']
}
if($a1['b']!=$a2['a']){
输出$a1['b']
}
if($a1['c']!=$a2['a']){
输出$a1['c']
}

所以输出结果是array("b"=>"green","c"=>"blue");

array_diff_ukey则只是比较键名,不管键值。因为自定义函数总数返回0,所以返回结果为空

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题