array_udiff 用回调函数比较数据来计算数组的差集

发表日期:2021-07-01 08:57:08 | 来源: | | 浏览(726) 分类:数组 函数

array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiff用回调函数比较数据来计算数组的差集

说明

array_udiff(
    array $array1,
    array $array2,
    array $... = ?,
    callable $value_compare_func
): array

使用回调函数比较数据,计算数组的不同之处。和 array_diff() 不同的是,前者使用内置函数进行数据比较。

参数

array1

第一个数组。

array2

第二个数组。

value_compare_func

回调对照函数。

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

callback(mixed $a, mixed $b): int

返回值

返回 array1 里没有出现在其他参数里的所有值。

范例

示例 #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
        )

)

示例 #2 array_udiff() 使用 DateTime 对象的例子

<?php 
class 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.

注释

注意: 注意本函数只检查了多维数组中的一维。当然,可以用 array_udiff($array1[0], $array2[0], "data_compare_func"); 来检查更深的维度。

参见

集速网 copyRight © 2015-2022 宁ICP备15000399号-1 宁公网安备 64010402001209号
与其临渊羡鱼,不如退而结网
欢迎转载、分享、引用、推荐、收藏。