PHP array_udiff_uassoc 函数

一、函数功能:
  计算出第一个数组与其他数组的差集(考虑键名和键值,对键名和键值的比较都使用自定义函数)。比较两到多个数组,找出第一个数组中不包含在其他任何数组中的键/值对。此函数键值比较和键名比较都使用用户自定义函数。关于计算差集系列函数的区别请参考:PHP数组计算差集系列函数的区别

二、函数语法:

1
array array_udiff_uassoc($array1 $array2[, $...], $user_value_compare_func$user_key_compare_func)

三、函数参数:

参数名 描述
$array1 参与比较的第一个数组;
$array2 参与比较的第二个数组;
... 参与比较的更多数组;
$user_value_compare_func 用户自定义回调函数,用来比较键值。如果认为第一个键值小于,等于,或大于第二个键值时必须分别返回一个小于零,等于零,或大于零的整数。只有键名比较返回0,对应的键值才会传递给此自定义函数比较。
$user_key_compare_func 用户自定义回调函数,用来比较键名。如果认为第一个键名小于,等于,或大于第二个键名时必须分别返回一个小于零,等于零,或大于零的整数。

四、返回值:

1
返回第一个数组与其他数组的键名/键值对差集组成的数组。

五、用法举例:
1、array_udiff_uassoc 函数工作流程解析:
  大体分为3步:1、每个数组key的排序去重;2、判断第一个数组的key是否与其他数组的key相等,如果相等返回0,然后执行第3步;3、判断第2步相等的key对应的值是否相等,相等返回0,此key和对应的值不会再出现在返回数组中,执行第1步比较下一对key。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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('爱E族''aiezu''b'=>'bb',);
$arr2 array('name'=>'爱E族''b'=>'bb''aiezu');
  
$result array_udiff_uassoc($arr1$arr2"user_value_compare_func""user_key_compare_func");
print_r($result);

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
debug   key: 1 vs 0 1  #$arr1的key排序去重
debug   key: b vs 1 -1
debug   key: 0 vs b -1     #$arr2的key排序去重
debug   key: b vs name -1
 
debug   key: 0 vs b -1   #key不相等
debug   key: 0 vs 0 0  #key相等,下步比较key对应的键值
debug value: 爱E族 vs aiezu 1  #key对应的键值不相等,key:0,value:爱E族会出现在返回数组中
debug   key: b vs 0 -1
debug   key: b vs b 0    #key相等,下步比较key对应的键值
debug value: bb vs bb 0    #key对应的键值也相等,$arr1中键b和对应的键值bb不会出现在返回数组中
debug   key: 1 vs 0 1
debug   key: 1 vs b 1
debug   key: 1 vs name 1
Array
(
    [0] => 爱E族
    [1] => aiezu
)

2、使用类函数作为键值和键名比较函数,找出三个数组的差集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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');
$arr3 array('1'=>'aiezu');
$result array_udiff_uassoc($arr1$arr2$arr3array("user""value_compare"), array("user""key_compare"));
print_r($result);

输出:

1
2
3
4
Array
(
    [0] => 爱E族
)

array_udiff_uassoc的更多相关文章

  1. php array_udiff_uassoc比较数组的键值与值

    php array_udiff_uassoc 用于带索引检查计算数组的差集,用回调函数比较数据和索引.本文章通过实例向大家介绍array_udiff_uassoc函数的使用方法.需要的码农可以参考一下 ...

  2. array_udiff、array_udiff_assoc、array_udiff_uassoc 使用方法

      <?php // array_udiff 用自定义函数比较数组的差值(array_diff 使用内置函数) // 使用该函数我们通过进行更复杂的比较 class Rectangle { pu ...

  3. PHP array_udiff_uassoc

    1.函数的参数:返回数组的差集.用定义的函数比较键值和值. 2.函数的参数: @params array $array @params array $array1 ... @params callab ...

  4. PHP array_udiff_uassoc() 函数

    实例 比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回差集: <?phpfunction myfunction_key($a,$b){if ($a===$b){return 0;} ...

  5. php 基础代码大全(不断完善中)

    下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...

  6. PHP数组函数总结

    array_change_key_case - 返回字符串键名全为小写或大写的数组 array_chunk - 将一个数组分割成多个 array_column - 返回数组中指定的一列 array_c ...

  7. PHP7函数大全(4553个函数)

    转载来自: http://www.infocool.net/kb/PHP/201607/168683.html a 函数 说明 abs 绝对值 acos 反余弦 acosh 反双曲余弦 addcsla ...

  8. php5 数据类型

    一.PHP主要有一下几种数据类型 String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值) ...

  9. 两千行PHP学习笔记

    亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...

随机推荐

  1. UVALive - 7041 G - The Problem to Slow Down You

    题意:求两个串的公共回文子串个数 题解:建两个回文自动机,从0和1各跑一边就是答案了,因为对于回文自动机来说,从头开始dfs就能找出该字符串的所有回文串 //#pragma GCC optimize( ...

  2. spring boot 多数据源配置与使用

    在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文 ...

  3. shiro中单点登录

    Shiro 1.2开始提供了Jasig CAS单点登录的支持,单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录.此处我们使用Ja ...

  4. ie8不支持currentTarget的解决办法

    一般绑定事件时,我们都会在事件回调方法里用event.currentTarget获取当前对象,但到ie8里就获取不到了. 解决方法如下: var eve = event || window.event ...

  5. tornado 异步

    引言 注:正文中引用的 Tornado 代码除特别说明外,都默认引用自 Tornado 4.0.1. tornado.gen 模块是一个基于 python generator 实现的异步编程接口.通过 ...

  6. DBMS_ROWID定位数据行物理存储位置

    对于Oracle中的堆表,我们可以通过oracle内置的ROWID伪列得到对应行记录所在的ROWID的值(注意,这个ROWID只是一个伪列,实际的块中并不存在该列).然后我们可以通过DBMS_ROWI ...

  7. mysql的五种日期和时间类型【转载】

    [mysql的五种日期和时间类型] mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期 ...

  8. MYSQL--三大范式

    MYSQL--三大范式 范式简介: 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小.目前关系数据库有六 ...

  9. Mysql for Linux安装配置之—— rpm(bundle)安装

    1.准备及安装1)下载rpm安装包(或rpm bundle)  rpm安装包包括两个(bundle会更多),一个是client,另一个是server,例如:MySQL-client-5.5.44-1. ...

  10. 【转】借助System.Linq.Dynamic, IQueryable根据排序字符串排序

    在使用Entity Framework时,若有多个排序,需要OrderBy (OrderByDescending)再ThenBy (ThenByDescending) 假设需要根据Name升序排序,再 ...