Home  >  Q&A  >  body text

php array_udiff工作原理

php的array_udiff的工作原理实在搞不懂,尤其是回调函数,

    $arr1 = array('m1'=>1, 'm2'=>5, 'm3'=>3);
    $arr2 = array('n2'=>4, 'n2'=>5, 'n3'=>6);

    var_dump(array_udiff($arr1, $arr2, function($a, $b){
        print_r($a.'~~~~'.$b.'<br/>');
        if($a>$b) 
            return 1;
        else
            return 0;
    })
);

每次的回调函数的参数是什么, 我把它打印出来,可并不像期望的那样,$arr1的每个元素值直接与$arr2的每个元素值相比较,而是

5~~~~1
3~~~~5
1~~~~3
6~~~~5
1~~~~5
1~~~~3
3~~~~5

回调函数返回的结果又是做什么用的,求解

最后吐槽一下,网上查的结果全他么都是从www3school和php.net复制下来的,实在不能忍,操

大家讲道理大家讲道理2654 days ago731

reply all(3)I'll reply

  • PHPz

    PHPz2017-04-10 15:13:04

    先不要管它内部是怎么实现比较算法的,我们在callback里 需要实现的是 回调函数的第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
    楼主的例子更改为如下时,便可实现正常的比较功能:

    $arr1 = array('m1'=>1, 'm2'=>5, 'm3'=>3);
    $arr2 = array('n2'=>4, 'n2'=>5, 'n3'=>6);
    
    var_dump(array_udiff($arr1, $arr2, function($a, $b){
    print_r($a.'~~~~'.$b.'<br/>');
     if($a>$b){
        return 1;
     } else if($a == $b) {
        return  0;
     } else if($a < $b) {
        return -1;
     }
    }));
    

    回调函数只要实现如何判断传进来的两个值是相等还是大于小于的关系即可。这两个值都是数组的元素。但是不要误会 第一个参数是第一个数组的值,第二个参数是第二个数组的值。

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 15:13:04

    call_back在这个函数中有2个作用,
    * 排序 将array_udiff中的每个参数排序,并返回hash之后的数组
    * 过滤 将第一个数组与其他数组比较,过滤出要返回的值
    P.S. 我确定这个过程是正确的。参考PHP: array_udiff()

    在你的例子中

    $arr1 = array('m1'=>1, 'm2'=>5, 'm3'=>3);
    $arr2 = array('n2'=>4, 'n2'=>5, 'n3'=>6); //n2=>4应该是n1吧?
    
    输出中的前4项
    5~~~~1
    3~~~~5
    1~~~~3
    6~~~~5
    就是在做排序
    
    拍完序之后,会把第一数组中的每一个项去其他数组中检查,若不存在则将该项放入返回数组中。
    
    但是从输出的内容上看有点诡异,我也不明白!囧。
    

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:13:04

    array_diff本身是计算数组的差集。貌似不支持回调函数吧?
    http://cn2.php.net/manual/zh/function.array-diff.php

    reply
    0
  • Cancelreply