PHP Conference Japan 2024

array_intersect_key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_key使用鍵名比較來計算陣列的交集

描述

array_intersect_key()(array $array, array ...$arrays): array

array_intersect_key() 返回一個陣列,其中包含 array 中所有在所有參數中都存在的鍵名。

參數

array

要檢查的主鍵陣列。

arrays

要與之比較鍵名的陣列。

回傳值

返回一個關聯陣列,其中包含 array 中所有在所有參數中都存在的鍵名。

更新日誌

版本 描述
8.0.0 此函式現在可以使用一個參數呼叫。先前,至少需要兩個參數。

範例

範例 1 array_intersect_key() 範例

<?php
$array1
= array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

var_dump(array_intersect_key($array1, $array2));
?>

上述範例會輸出

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

在我們的範例中,您可以看到只有鍵名 'blue''green' 出現在兩個陣列中,因此被返回。另請注意,鍵名 'blue''green' 的值在兩個陣列之間有所不同。仍然會發生匹配,因為僅檢查鍵名。返回的值是 array 的值。

只有在 (string) $key1 === (string) $key2 時,key => value 配對中的兩個鍵才被視為相等。換句話說,會執行嚴格的型別檢查,因此字串表示形式必須相同。

另請參閱

新增註解

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

vladas dot dirzys at gmail dot com
12 年前
簡單的鍵名白名單篩選器

<?php
$arr
= array('a' => 123, 'b' => 213, 'c' => 321);
$allowed = array('b', 'c');

print_r(array_intersect_key($arr, array_flip($allowed)));
?>

將返回
陣列
(
[b] => 213
[c] => 321
)
Anonymous
3 年前
請注意,返回的陣列中鍵的順序與來源陣列中鍵的順序相同。

若要依第二個陣列排序,您可以使用 array_replace 來完成。

<?php
$array
= array(
'two' => 'a',
'three' => 'b',
'one' => 'c',
);

$keyswant = array(
'one' => '',
'three' => '',
);

print_r(array_intersect_key(array_replace($keyswant, $array), $keyswant));

?>

顯示

陣列
(
[one] => c
[three] => b
)

而非

陣列
(
[three] => b
[one] => c
)
github.com/xmarcos
10 年前
[編輯註記:將 array_merge_recursive() 改為 array_replace_recursive() 以修正腳本]

這裡有一個更好的方法可以使用預設值作為白名單來合併設定。

<?php

$defaults
= [
'id' => 123456,
'client_id' => null,
'client_secret' => null,
'options' => [
'trusted' => false,
'active' => false
]
];

$options = [
'client_id' => 789,
'client_secret' => '5ebe2294ecd0e0f08eab7690d2a6ee69',
'client_password' => '5f4dcc3b5aa765d61d8327deb882cf99', // 忽略
'client_name' => 'IGNORED', // 忽略
'options' => [
'active' => true
]
];

var_dump(
array_replace_recursive($defaults,
array_intersect_key(
$options, $defaults
)
)
);

?>

輸出

array (大小=4)
'id' => int 123456
'client_id' => int 789
'client_secret' => string '5ebe2294ecd0e0f08eab7690d2a6ee69' (長度=32)
'options' =>
array (大小=2)
'trusted' => boolean false
'active' => boolean true
Reed Silver
9 年前
如果你想要一個陣列,其中沒有從第二個陣列加入的鍵值對

$new = array_intersect_key($b, $a) + $a;
pgl at yoyo dot org
13 年前
請注意,返回陣列中鍵的順序與來源陣列中鍵的順序相同。例如

<?php
$array
= array(
'two' => 'a',
'three' => 'b',
'one' => 'c',
);

$keyswant = array(
'one' => '',
'three' => '',
);

print_r(array_intersect_key($array, $keyswant));

?>

顯示

陣列
(
[three] => b
[one] => c
)
CBWhiz at gmail dot com
16 年前
我發現以下內容很有幫助
<?PHP
function array_merge_default($default, $data) {
$intersect = array_intersect_key($data, $default); //取得存在預設值的資料
$diff = array_diff_key($default, $data); //取得資料中不存在的預設值
return $diff + $intersect; //陣列具有不同的鍵,返回兩者的聯集
}
?>
它的使用方式與它所使用的兩個函數類似,但保留預設值和_僅限_預設值。它是為鍵陣列設計的,我不確定它在數值索引陣列上的效果如何。

範例
<?PHP
$default
= array(
"one" => 1,
"two" => 2
);
$untrusted = array(
"one" => 42,
"three" => 3
);
var_dump(array_merge_default($default, $untrusted));

array(
2) {
[
"two"]=>
int(2)
[
"one"]=>
int(42)
}

?>
Anton Backer
18 年前
Jesse:不,array_intersect_key 並沒有達到你發佈的相同效果

array_flip (array_intersect (array_flip ($a), array_flip ($b)))

因為當陣列被翻轉時,值會變成鍵。具有重複的值不是問題,但具有重複的鍵是問題。array_flip 通過僅保留一個重複項並捨棄其餘重複項來解決此問題。當你開始相交時,你已經丟失了資訊。
chrisbloom7 at gmail dot com
15 年前
關於 php at keithtylerdotcom 解決方案來模擬

<?php
$z
= someFuncReturningAnArray()['some_key'];
?>

他推薦的解決方案仍然會返回一個陣列。若要取得函式返回的陣列中單個鍵的值,只需將 implode() 新增到公式中

<?php
function someFuncReturningAnArray() {
return array(
'a' => 'b',
'c' => 'd',
'e' => 'f',
'g' => 'h',
'i' => 'j'
);
}

//傳統方式
$temp = someFuncReturningAnArray();
$b = $temp['a'];
echo
print_r($b, 1) . "\n----------\n";

//keithtylerdotcom 單行方法
$b = array_intersect_key(someFuncReturningAnArray(), array('a'=>''));
echo
print_r($b, 1) . "\n----------\n";

//更好的單行方法
$b = implode('', array_intersect_key(someFuncReturningAnArray(), array('a'=>'')));
echo
print_r($b, 1) . "\n----------\n";
?>
markus dot kappe at dix dot at
15 年前
<?php
/**
* 計算兩個陣列的交集,類似 array_intersect_key,但採用遞迴方式
*
* @param array/mixed 主陣列
* @param array 具有應保留在主陣列中的鍵的陣列
* @return array/mixed 清理過的主陣列
*/
function myIntersect($master, $mask) {
if (!
is_array($master)) { return $master; }
foreach (
$master as $k=>$v) {
if (!isset(
$mask[$k])) { unset ($master[$k]); continue; } // 如果鍵不存在於 $mask 中,則從 $master 中移除值
if (is_array($mask[$k])) { $master[$k] = $this->myIntersect($master[$k], $mask[$k]); } // 當 mask 為陣列時進行遞迴
// 否則僅保留值
}
return
$master;
}
?>
pixelf3hler at visualize-me dot de
11 年前
如果你來這裡尋找一個返回陣列的函數,該陣列包含具有相交鍵的`所有`陣列的值
<?php
function array_merge_on_key($key, $array1, $array2) {
$arrays = array_slice(func_get_args(), 1);
$r = array();
foreach(
$arrays as &$a) {
if(
array_key_exists($key, $a)) {
$r[] = $a[$key];
continue;
}
}
return
$r;
}
// 範例:
$array1 = array("id" => 12, "name" => "Karl");
$array2 = array("id" => 4, "name" => "Franz");
$array3 = array("id" => 9, "name" => "Helmut");
$array4 = array("id" => 10, "name" => "Kurt");

$result = array_merge_on_key("id", $array1, $array2, $array3, $array4);

echo
implode(",", $result); // => 12,4,9,10
?>
pdemaziere at gmail dot com
15 年前
這是一個簡單的腳本,如果您想使用一個只包含 0 和 1 的陣列作為另一個陣列的遮罩(當然,這兩個陣列的大小必須相同)。$outcome 是一個陣列,只包含 $source 中 $mask 等於 1 的值。

<?php
$outcome
= array_values(array_intersect_key( array_values($source), array_filter(array_values($mask)) ));
?>

附註:array_values() 函數是必要的,以確保兩個陣列具有相同的編號/鍵,否則您的遮罩行為將不如您預期。

請享用!
To Top