search

Home  >  Q&A  >  body text

php - 关于array_udiff_assoc和array_intersect_ukey的问题?

在家没事背背函数,出现了以下问题?求助!谢谢~

不好意思!我还想请教一下:

function k($k1,$k2){
    if($k1>$k2){
        return 1;
    }elseif($k1<$k2){
        return -1;
    }else{
        return 0;
    }
}
function v($v1,$v2){
    if($v1>$v2){
        return -1;
    }elseif($v1<$v2){
        return 0;
    }else{
        return 0;
    }
}
$a = array(0=>"Cat",1=>"Dog",2=>"Horse");
$b = array(2=>"Bird",3=>"Rat",4=>"Fish");
print_r(array_udiff_uassoc($a,$b,'k','v'));

以上这个例子:
健名和健值同时使用两个不同的回调函数,一个正值是1,一个正值是0
正值或负值才会输出或返回,0则不会输出。
我把key设置正值是应该输出的,同时它的val设置为0它就不会输出了。
它们不会冲突吗? 这又应该咋么去解释呢?
还有字符串是如何比叫大于和小于的?是按字节算的吗?谢谢了!

ringa_leeringa_lee2820 days ago1089

reply all(2)I'll reply

  • ringa_lee

    ringa_lee2017-04-10 14:38:54

    1) array_udiff_assoc和array_diff_uassoc真的可以作为别名使用吗? @怡红公子 抱歉,你貌似把代码里面的两个函数名看错了。不过不得不吐槽题主直接拿截图贴代码啊,想测试答题的人还须有再敲一遍...

    不能,能做别名的话php手册上就说明了。类似array_diff_assoc命名的函数有4个,其中u都是标示是否接受用户传入回调函数的意思。diff表示对数组值进行比较,assoc表示是否同时也比较键值(即key和value都相同才认为相同)。diff前面有u表示支持用户传入数组值的自定义比较函数,assoc前面有u表示支持用户传入数组建值的自定义比较函数。

    你输出的结果相同只是因为你的处理结果却是正好相同而已,我们判断函数别名不能根据输出结果来判断的。array_udiff_assoc回调传给All函数的$v1、$v2是数组的值(green,grown...);而array_diff_uassoc回调传给All函数的$v1、$v2是数组的键值(a、b、c...)。

    2) array_intersect_key和array_intersect_ukey都是查询有交叉键值并返回的,区别是后者使用自定义的回调函数。

    如 @怡红公子 所说,返回不同却是是因为你把回调函数写错了。那么为什么错了呢?简单的说,因为PHP底层在做比较的时候,先会分别对两个数组的keys进行一次快速排序,那么如果第一组keys里面的第3个值已经大于第二组keys里面的第2个值(回调函数return 1;表示大于),那么接下来进行第一组第4个值的比较时,就直接略过第二组的前2个值了。为了提高效率,这就是为什么回调函数须有返回-1、0、1三个不同的值的原因了。

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 14:38:54

    开篇先吐槽,骚年没事要好好的看看手册啊。

    array_diff_assocarray_udiff_assoc

    看错函数了,应该是array_diff_uassocarray_udiff_assoc的区别,如 @samoay 所讲,就是一个是比较键,一个是比较值的。这个在手册的中文描述中确实看不大出来,不过看示例就非常清楚了。如果要知道详细的,可以看 @samoay 的答案。

    ----------我是错误答案分割线----------

    这两个明显是不同的函数,最大的区别是array_udiff_assoc可以使用第三个参数来自定义对比的方式。而array_diff_assoc是没有这个回调函数的参数的,你的示例中明显使用错了。引用官方手册的话的话是这么说的:

    array_udiff_assoc() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意和 array_diff() 与 array_udiff() 不同的是键名也用于比较。数组数据的比较是用用户提供的回调函数进行的。在此方面和 array_diff_assoc() 的行为正好相反,后者是用内部函数进行比较的。 —— array_udiff_assoc

    要说这里得出的结果一致的问题,只能说这是因为你写的回调函数刚好和系统自带的判别方式结果相同罢了,不能说明两个函数就是一个函数。同类型的函数也有很多,例如sortusort
    ----------错误答案结束----------

    array_intersect_keyarray_intersect_ukey

    这里就更需要吐槽一下你了,之所以你的array_intersect_ukey没有返回结果的原因很简单,是你的Keys函数没有写对好么。请看看官方手册怎么说的:

    key_compare_func
    在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
    —— array_intersect_ukey

    看清楚,需要分别返回三个整数值好么,和array_udiff_assoc是不一样的,不要随便套用。实际测试了,如果返回正确的值的话是正常的,下面是我测试的示例代码:

    <?php
    $a = array(
        0=>'DOG',
        1=>'CAT',
        2=>'HORSE'
        );
    $b = array(
        3=>'RAT',
        1=>'BIRD',
        5=>'MONKEY'
        );
    
    function keys($k1, $k2) {
        if($k1 > $k2) 
            return 1;
        else if($k1 < $k2)
            return -1;
        else 
            return 0;
    }
    
    print_r(array_intersect_key($a, $b));
    print_r(array_intersect_ukey($a, $b, "keys"));
    //返回 Array ( [1] => CAT ) Array ( [1] => CAT )
    

    reply
    0
  • Cancelreply