php数组求差集函数,PHP数组计算差集系列函数的区别

一、函数介绍:

PHP数组差集计算函数,用来计算一个数组与其他数组的差集。计算类型分为计算键名的差集、计算键值的差集、计算键名/值对的差集三类;计算方式分为系统默认函数计算和使用用户自定义函数计算两种。PHP数组差集计算函数共有8个。计算键名的差集:计算第一个数组与其他数组键名的差集(不考虑键值),返回时键名对应的键值保持不变一起返回。计算键名的差集函数有:array_diff_key(),array_diff_ukey()。

计算键值的差集:计算第一个数组与其他数组键值的差集(不考虑键名),返回时键值对应的键名保持不变一起返回。计算键值的差集函数有:array_diff(),array_udiff()。

计算键名/值对的差集:计算第一个数组与其他数组的差集(同时考虑键名和键值)。计算键名/值对的差集函数有:array_diff_assoc(),array_udiff_assoc(),array_diff_uassoc(),array_udiff_uassoc()。

数组差集比较函数功能差异表:函数名计算何种差集键名比较函数键值比较函数

键值的差集,不考虑键名-系统默认

键值的差集,不考虑键名-自定义函数

键名和键值的差集系统默认系统默认

键名和键值的差集自定义函数系统默认

键名的差集,不考虑键值系统默认-

键名的差集,不考虑键值自定义函数-

键名和键值的差集系统默认自定义函数

键名和键值的差集自定义函数自定义函数 PHP数组计算交集系列函数的区别:http://aiezu.com/article/php_array_intersect_sets.html

二、参数中的自定义函数:

差集比较函数通过比较键名、键值是否想等,把完全相等的剔除掉,从而找出它与其它数组的差集。为了方便大家实现个性化的需求,PHP为部分函数提供了接口,可以使用自定义函数来比较键名、键值是否相等。PHP会传递两个键名给键名自定义比较函数、或者两个键值给自定义键值比较函数,用户可以在自定义比较函数中根据自己的需求进行比较,只需给自定义函数一个整型返回值就行(返回0认为键名或键值相等)。

自定义比较函数举例:

1、使用基础函数方式:<?php

#键名比较函数

function user_key_compare_func($k1, $k2) {

if ( $k1 === $k2 ) {

return 0;

}

return $k1 > $k2 ? 1 : -1;

}

#键值比较函数

function user_value_compare_func($v1, $v2) {

if ( $v1 === $v2 ) {

return 0;

}

return $v1 > $v2 ? 1 : -1;

}输出:<?php

array_diff_ukey($arr1, $arr2, 'user_key_compare_func');

array_udiff($arr1, $arr2, 'user_value_compare_func');

array_udiff_uassoc($arr1, $arr2, 'user_value_compare_func', 'user_key_compare_func');

array_udiff_uassoc($arr1, $arr2, $arr3, 'user_value_compare_func', 'user_key_compare_func');

2、使用类的函数方式:<?php

class user {

function key_compare($k1, $k2) {

if ( $k1 === $k2 ) {

return 0;

}

return $k1 > $k2 ? 1 : -1;

}

function value_compare($v1, $v2) {

if ( $v1 === $v2 ) {

return 0;

}

return $v1 > $v2 ? 1 : -1;

}

}输出:<?php

array_diff_ukey($arr1, $arr2, array('user', 'key_compare'));

array_udiff($arr1, $arr2, array('user', 'value_compare'));

array_udiff_uassoc($arr1, $arr2, array('user', 'value_compare'), array('user', 'key_compare'));

三、用法举例:

1、使用基础自定义函数作为比较函数完整代码:<?php

function user_key_compare_func($k1, $k2) {

if ( $k1 === $k2 ) {

return 0;

}

return $k1 > $k2 ? 1 : -1;

}

function user_value_compare_func($v1, $v2) {

if ( $v1 === $v2 ) {

return 0;

}

return $v1 > $v2 ? 1 : -1;

}

$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);

$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');

print_r(array_diff_ukey($arr1, $arr2, 'user_key_compare_func'));

print_r(array_udiff($arr1, $arr2, 'user_value_compare_func'));

print_r(array_udiff_uassoc($arr1, $arr2, 'user_value_compare_func', 'user_key_compare_func'));Array

(

[1] => aiezu

)

Array

(

)

Array

(

[0] => 爱E族

[1] => aiezu

)

2、使用类函数作为比较函数完整代码:<?php

class user {

function key_compare($k1, $k2) {

if ( $k1 === $k2 ) {

return 0;

}

return $k1 > $k2 ? 1 : -1;

}

function value_compare($v1, $v2) {

if ( $v1 === $v2 ) {

return 0;

}

return $v1 > $v2 ? 1 : -1;

}

}

$arr1 = array('爱E族', 'aiezu', 'b'=>'bb',);

$arr2 = array('name'=>'爱E族', 'b'=>'bb', 'aiezu');

print_r(array_diff_ukey($arr1, $arr2, array('user', 'key_compare')));

print_r(array_udiff($arr1, $arr2, array('user', 'value_compare')));

print_r(array_udiff_uassoc($arr1, $arr2, array('user', 'value_compare'), array('user', 'key_compare')));输出:Array

(

[1] => aiezu

)

Array

(

)

Array

(

[0] => 爱E族

[1] => aiezu

)

3、差集比较函数的工作流程:

这里以array_udiff_uassoc()函数举例解析差集比较函数的工作流程,array_udiff_uassoc()函数是使用自定义函数计算出第一个数组与其他数组的差集(考虑键名和键值,对键名和键值都使用自定义函数)。<?php

function user_key_compare_func($k1, $k2) {

echo sprintf("debug key: %s vs %s %s\n", $k1, $k2, $k1===$k2 ? 0 : ($k1>$k2?1:-1) ); //debug行

if ( $k1 === $k2 ) {

return 0;

}

return $k1 > $k2 ? 1 : -1;

}

function user_value_compare_func($v1, $v2) {

echo sprintf("debug value: %s vs %s %s\n", $v1, $v2, $v1===$v2 ? 0 : ($v1>$v2?1:-1) ); //debug行

if ( $v1 === $v2 ) {

return 0;

}

return $v1 > $v2 ? 1 : -1;

}

$arr1 = array('usage', 'name'=>'aiezu', 'suffix'=>'com',);

$arr2 = array('0'=>'usage', 'name'=>'爱E族');

print_r(array_udiff_uassoc($arr1, $arr2, 'user_value_compare_func', 'user_key_compare_func'));输出:debug key: name vs 0 -1 #$arr1的key排序去重

debug key: suffix vs name 1

debug key: 0 vs name -1 #$arr2的key排序去重

debug key: name vs 0 -1

debug key: 0 vs name -1

debug key: 0 vs 0 0 #key相等,下步判断key对应的值是否相等

debug value: usage vs usage 0 #key对应的值也相等,key:0,value:usage不会出现在返回结果中

debug key: name vs name 0 #key相等,下步判断key对应的值是否相等

debug value: aiezu vs 爱E族 -1 #key对应的值不相等,key:name,value:aiezu将出现在返回结果中

debug key: suffix vs name 1

debug key: suffix vs 0 -1

Array

(

[name] => aiezu

[suffix] => com

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值