Php/docs/function.array-udiff
array_udiff
(PHP 5, PHP 7)
array_udiff — 用回调函数比较数据来计算数组的差集
说明
array_udiff
( array $array1
, array $array2
[, array $...
], callable $value_compare_func
) : array
使用回调函数比较数据,计算数组的不同之处。和 array_diff() 不同的是,前者使用内置函数进行数据比较。
参数
array1
第一个数组。
array2
第二个数组。
value_compare_func
回调对照函数。
在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。
返回值
返回 array1
里没有出现在其他参数里的所有值。
范例
Example #1 array_udiff() 使用 stdClass 对象的例子
<?php// Arrays to compare$array1 = array(new stdclass, new stdclass, new stdclass, new stdclass, );$array2 = array( new stdclass, new stdclass, );// Set some properties for each object$array1[0]->width = 11; $array1[0]->height = 3;$array1[1]->width = 7; $array1[1]->height = 1;$array1[2]->width = 2; $array1[2]->height = 9;$array1[3]->width = 5; $array1[3]->height = 7;$array2[0]->width = 7; $array2[0]->height = 5;$array2[1]->width = 9; $array2[1]->height = 2;function compare_by_area($a, $b) { $areaA = $a->width * $a->height; $areaB = $b->width * $b->height; if ($areaA < $areaB) { return -1; } elseif ($areaA > $areaB) { return 1; } else { return 0; }}print_r(array_udiff($array1, $array2, 'compare_by_area'));?>
以上例程会输出:
Array ( [0] => stdClass Object ( [width] => 11 [height] => 3 ) [1] => stdClass Object ( [width] => 7 [height] => 1 ) )
Example #2 array_udiff() 使用 DateTime 对象的例子
<?phpclass MyCalendar { public $free = array(); public $booked = array(); public function __construct($week = 'now') { $start = new DateTime($week); $start->modify('Monday this week midnight'); $end = clone $start; $end->modify('Friday this week midnight'); $interval = new DateInterval('P1D'); foreach (new DatePeriod($start, $interval, $end) as $freeTime) { $this->free[] = $freeTime; } } public function bookAppointment(DateTime $date, $note) { $this->booked[] = array('date' => $date->modify('midnight'), 'note' => $note); } public function checkAvailability() { return array_udiff($this->free, $this->booked, array($this, 'customCompare')); } public function customCompare($free, $booked) { if (is_array($free)) $a = $free['date']; else $a = $free; if (is_array($booked)) $b = $booked['date']; else $b = $booked; if ($a == $b) { return 0; } elseif ($a > $b) { return 1; } else { return -1; } }}// Create a calendar for weekly appointments$myCalendar = new MyCalendar;// Book some appointments for this week$myCalendar->bookAppointment(new DateTime('Monday this week'), "Cleaning GoogleGuy's apartment.");$myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Going on a snowboarding trip.");$myCalendar->bookAppointment(new DateTime('Friday this week'), "Fixing buggy code.");// Check availability of days by comparing $booked dates against $free datesecho "I'm available on the following days this week...\n\n";foreach ($myCalendar->checkAvailability() as $free) { echo $free->format('l'), "\n"; }echo "\n\n";echo "I'm busy on the following days this week...\n\n";foreach ($myCalendar->booked as $booked) { echo $booked['date']->format('l'), ": ", $booked['note'], "\n"; }?>
以上例程会输出:
I'm available on the following days this week... Tuesday Thursday I'm busy on the following days this week... Monday: Cleaning GoogleGuy's apartment. Wednesday: Going on a snowboarding trip. Friday: Fixing buggy code.
注释
Note:
注意本函数只检查了多维数组中的一维。当然,可以用
array_udiff($array1[0], $array2[0], "data_compare_func");
来检查更深的维度。
参见
- array_diff() - 计算数组的差集
- array_diff_assoc() - 带索引检查计算数组的差集
- array_diff_uassoc() - 用用户提供的回调函数做索引检查来计算数组的差集
- array_udiff_assoc() - 带索引检查计算数组的差集,用回调函数比较数据
- array_udiff_uassoc() - 带索引检查计算数组的差集,用回调函数比较数据和索引
- array_intersect() - 计算数组的交集
- array_intersect_assoc() - 带索引检查计算数组的交集
- array_uintersect() - 计算数组的交集,用回调函数比较数据
- array_uintersect_assoc() - 带索引检查计算数组的交集,用回调函数比较数据
- array_uintersect_uassoc() - 带索引检查计算数组的交集,用单独的回调函数比较数据和索引