PHP Conference Japan 2024

array_uintersect

(PHP 5, PHP 7, PHP 8)

array_uintersect計算陣列的交集,使用回呼函式比較資料

說明

array_uintersect(陣列 $array, 陣列 ...$arrays, 可呼叫 $value_compare_func): 陣列

計算陣列的交集,透過回呼函式比較資料。

參數

array

第一個陣列。

arrays

要比較的陣列。

value_compare_func

比較函式必須回傳一個整數。若第一個參數分別小於、等於或大於第二個參數,則回傳值應小於零、等於零或大於零。

callback(mixed $a, mixed $b): int
注意事項

從比較函式回傳*非整數*值,例如 float,將導致回呼函式回傳值被內部強制轉型為 int。因此,諸如 0.990.1 之類的值都將被強制轉型為整數值 0,這將導致這些值被視為相等。

注意事項

排序回呼函式必須能夠處理來自任何陣列的任何值,且順序不限,與它們最初提供的順序無關。這是因為每個陣列在與其他陣列比較之前都會先進行排序。例如:

<?php
$arrayA
= ["string", 1];
$arrayB = [["value" => 1]];
// $item1 和 $item2 可以是 "string"、1 或 ["value" => 1] 中的任何一個
$compareFunc = static function ($item1, $item2) {
$value1 = is_string($item1) ? strlen($item1) : (is_array($item1) ? $item1["value"] : $item1);
$value2 = is_string($item2) ? strlen($item2) : (is_array($item2) ? $item2["value"] : $item2);
return
$value1 <=> $value2;
};
?>

回傳值

回傳一個陣列,包含所有在 array 中且同時存在於所有其他參數陣列中的值。

範例

範例 #1 array_uintersect() 範例

<?php
$array1
= array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect($array1, $array2, "strcasecmp"));
?>

上述範例會輸出:

Array
(
    [a] => green
    [b] => brown
    [0] => red
)

另請參閱

新增註解

使用者貢獻的註解 4 則註解

Nate at RuggFamily dot com
17 年前
我想強調的是,在使用者自訂函式中,您確實需要正確地返回 1 或 -1;如果結果相等,不能只返回 0,如果不相等則返回 1。

以下程式碼不正確

<?php
function myfunction($v1,$v2)
{
if (
$v1===$v2)
{
return
0;
}
return
1;
}

$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>

以下程式碼正確

<?php
函式 myfunction($v1,$v2)
{
if (
$v1===$v2)
{
return
0;
}
if (
$v1 > $v2) return 1;
return -
1;
}
$a1=陣列(1, 2, 4);
$a2=陣列(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>
Ryan C
2 年前
如果您正在編寫自己的比較函式,請記住太空船運算子(即 <=>)會是您最好的朋友。它從 PHP7 就開始有了。 https://php.dev.org.tw/manual/en/language.operators.comparison.php

因此,舉例來說,與其使用像這樣笨拙的函式:

<?php
函式 myFunction($v1, $v2) {
if (
$v1 === $v2) {
return
0;
}
if (
$v1 > $v2) return 1;
return -
1;
}
?>

您可以將其簡化為:

<?php
函式 myFunction($v1, $v2) {
return
$v1 <=> $v2;
}
?>
rob dot c dot ruiz at gmail dot com
6 年前
當嘗試在單詞陣列之間進行不區分大小寫的比較時,strcasecmp 函式可以很好地與這個函式配合使用,如下所示:

$arr1 = 陣列('blue', 'green', 'red');

$arr2 = 陣列('BLUE', 'Purple', 'Red');

$loose_matches = array_uintersect($arr1, $arr2, 'strcasecmp');

print_r($loose_matches) // 陣列('blue', 'red');
Hayley Watson
6 年前
至於其他「比較函式」回呼,回呼函式的返回值不需要是 -1、0 或 1。

cmp($a,$b) 只需要根據 $a<$b、$a=$b 或 $a>$b 分別 <0、=0 或 >0。
To Top