array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiff用回調(diào)函數(shù)比較數(shù)據(jù)來(lái)計(jì)算數(shù)組的差集

說(shuō)明

array_udiff(array $array, array ...$arrays, callable $value_compare_func): array

使用回調(diào)函數(shù)比較數(shù)據(jù),計(jì)算數(shù)組的不同之處。和 array_diff() 不同的是,前者使用內(nèi)置函數(shù)進(jìn)行數(shù)據(jù)比較。

參數(shù)

array

第一個(gè)數(shù)組。

arrays

要對(duì)比的數(shù)組。

value_compare_func

回調(diào)對(duì)照函數(shù)。

在第一個(gè)參數(shù)小于,等于或大于第二個(gè)參數(shù)時(shí),該比較函數(shù)必須相應(yīng)地返回一個(gè)小于,等于或大于 0 的整數(shù)。

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

返回值

返回 array 里沒有出現(xiàn)在其他參數(shù)里的所有值。

范例

示例 #1 array_udiff() 使用 stdClass 對(duì)象的例子

<?php
// 要對(duì)比的數(shù)組
$array1 = array(new stdclass, new stdclass,
                new 
stdclass, new stdclass,
               );

$array2 = array(
                new 
stdclass, new stdclass,
               );

// 為每個(gè)對(duì)象設(shè)置一些屬性
$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'));
?>

以上例程會(huì)輸出:

Array
(
    [0] => stdClass Object
        (
            [width] => 11
            [height] => 3
        )

    [1] => stdClass Object
        (
            [width] => 7
            [height] => 1
        )

)

示例 #2 array_udiff() 使用 DateTime 對(duì)象的例子

<?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;
        }
    }
}

// 為每周日程創(chuàng)建日歷
$myCalendar = new MyCalendar;

// 為本周預(yù)約一些日程
$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.");

// 通過(guò)對(duì)比 $booked 日期和 $free 日期獲取空閑的天數(shù)
echo "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"
}
?>

以上例程會(huì)輸出:

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.

注釋

注意: 注意本函數(shù)只檢查了多維數(shù)組中的一維。當(dāng)然,可以用 array_udiff($array1[0], $array2[0], "data_compare_func"); 來(lái)檢查更深的維度。

參見

  • array_diff() - 計(jì)算數(shù)組的差集
  • array_diff_assoc() - 帶索引檢查計(jì)算數(shù)組的差集
  • array_diff_uassoc() - 用用戶提供的回調(diào)函數(shù)做索引檢查來(lái)計(jì)算數(shù)組的差集
  • array_udiff_assoc() - 帶索引檢查計(jì)算數(shù)組的差集,用回調(diào)函數(shù)比較數(shù)據(jù)
  • array_udiff_uassoc() - 帶索引檢查計(jì)算數(shù)組的差集,用回調(diào)函數(shù)比較數(shù)據(jù)和索引
  • array_intersect() - 計(jì)算數(shù)組的交集
  • array_intersect_assoc() - 帶索引檢查計(jì)算數(shù)組的交集
  • array_uintersect() - 計(jì)算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)
  • array_uintersect_assoc() - 帶索引檢查計(jì)算數(shù)組的交集,用回調(diào)函數(shù)比較數(shù)據(jù)
  • array_uintersect_uassoc() - 帶索引檢查計(jì)算數(shù)組的交集,用單獨(dú)的回調(diào)函數(shù)比較數(shù)據(jù)和索引