2024 年 PHP Conference Japan

in_array

(PHP 4, PHP 5, PHP 7, PHP 8)

in_array檢查陣列中是否存在某個值

說明

in_array(混合類型 $needle, 陣列 $haystack, 布林值 $strict = false): 布林值

haystack 中搜尋 needle,除非設定 strict 參數,否則使用寬鬆比較。

參數

needle

要搜尋的值。

注意事項:

如果 needle 是字串,則比較會區分大小寫。

haystack

陣列。

strict

如果第三個參數 strict 設定為 true,則 in_array() 函式也會檢查 haystackneedle類型

注意事項:

在 PHP 8.0.0 之前,在非嚴格模式下,字串類型的 needle 會匹配陣列值 0,反之亦然。這可能會導致非預期的結果。其他類型也存在類似的邊緣情況。如果不完全確定所涉及值的類型,請始終使用 strict 旗標,以避免發生非預期的行為。

回傳值

如果在陣列中找到 needle,則回傳 true,否則回傳 false

範例

範例 #1 in_array() 範例

<?php
$os
= array("Mac", "NT", "Irix", "Linux");
if (
in_array("Irix", $os)) {
echo
"Got Irix";
}
if (
in_array("mac", $os)) {
echo
"Got mac";
}
?>

第二個條件判斷失敗,因為 in_array() 區分大小寫,所以上面的程式會顯示

Got Irix

範例 #2 使用嚴格模式的 in_array() 範例

<?php
$a
= array('1.10', 12.4, 1.13);

if (
in_array('12.4', $a, true)) {
echo
"'12.4' found with strict check\n";
}

if (
in_array(1.13, $a, true)) {
echo
"1.13 found with strict check\n";
}
?>

以上範例會輸出

1.13 found with strict check

範例 #3 以陣列作為 needle 的 in_array()

<?php
$a
= array(array('p', 'h'), array('p', 'r'), 'o');

if (
in_array(array('p', 'h'), $a)) {
echo
"'ph' was found\n";
}

if (
in_array(array('f', 'i'), $a)) {
echo
"'fi' was found\n";
}

if (
in_array('o', $a)) {
echo
"'o' was found\n";
}
?>

以上範例會輸出

'ph' was found
  'o' was found

另請參閱

  • array_search() - 搜尋陣列中指定的值,如果成功則返回第一個相應的鍵名。
  • isset() - 判斷變數是否已宣告且不為 null。
  • array_key_exists() - 檢查指定的鍵名或索引是否存在於陣列中。

新增筆記

使用者貢獻的筆記 6 則筆記

beingmrkenny at gmail dot com
13 年前
在某些陣列中使用寬鬆檢查會返回一些奇怪且違反直覺的結果。由於 PHP 對變數類型較為寬鬆,這是完全正確的行為,但在「現實生活中」幾乎毫無用處。

解決方案是使用嚴格檢查選項。

<?php

// 範例陣列

$array = array(
'egg' => true,
'cheese' => false,
'hair' => 765,
'goblins' => null,
'ogres' => 'no ogres allowed in this array'
);

// 寬鬆比對 -- 回傳值在註解中

// 前三個合理,後四個則否

in_array(null, $array); // true
in_array(false, $array); // true
in_array(765, $array); // true
in_array(763, $array); // true
in_array('egg', $array); // true
in_array('hhh', $array); // true
in_array(array(), $array); // true

// 嚴格比對

in_array(null, $array, true); // true
in_array(false, $array, true); // true
in_array(765, $array, true); // true
in_array(763, $array, true); // false
in_array('egg', $array, true); // false
in_array('hhh', $array, true); // false
in_array(array(), $array, true); // false

?>
Julian Sawicki
1 年前
這是個遞迴的 in_array 函式

<?php

$myNumbers
= [
[
1,2,3,4,5],
[
6,7,8,9,10],
];

$array = [
'numbers' => $myNumbers
];

// 讓我們嘗試在 $array 中查找數字 7
$hasNumber = in_array(7, $array, true); // bool(false)
$hasNumber = in_array_recursive(7, $array, true); // bool(true)

function in_array_recursive(mixed $needle, array $haystack, bool $strict): bool
{
foreach (
$haystack as $element) {
if (
$element === $needle) {
return
true;
}

$isFound = false;
if (
is_array($element)) {
$isFound = in_array_recursive($needle, $element, $strict);
}

if (
$isFound === true) {
return
true;
}
}

return
false;
}
rhill at xenu-directory dot net
15 年前
我發現,如果鍵不是以*相同順序*生成的,`in_array` 在嚴格模式下*不會*在關聯陣列的 haystack 中找到關聯陣列。

<?php

$needle
= array(
'fruit'=>'banana', 'vegetable'=>'carrot'
);

$haystack = array(
array(
'vegetable'=>'carrot', 'fruit'=>'banana'),
array(
'fruit'=>'apple', 'vegetable'=>'celery')
);

echo
in_array($needle, $haystack, true) ? 'true' : 'false';
// 輸出為 'false'

echo in_array($needle, $haystack) ? 'true' : 'false';
// 輸出為 'true'

?>

我錯誤地認為關聯陣列中項目的順序無關緊要,無論「嚴格」是 TRUE 還是 FALSE:*僅當*不在嚴格模式下,順序才無關緊要。
leonhard dot radonic+phpnet at gmail dot com
2 年前
我在使用 in_array 時遇到了一個非預期的行為。我使用了以下程式碼:

<?php
// ...
$someId = getSomeId(); // 這個 ID 是由另一個服務產生/擷取的,所以我不知道它的值會是什麼。備註:它是一個整數

// 我的邊緣案例場景中的實際資料:
// $someId = 0;
// $anyArray = ['dataOne', 'dataTwo'];
if (in_array($someId, $anyArray)) {
// 做一些工作
}
// ...
?>

在 PHP7.4 中,in_array 返回布林值 true。
在 PHP8.1 中,in_array 返回布林值 false。

我花了不少時間才找出問題所在。
eurorusty at yahoo dot ca
7 天前
我不確定為什麼 PHP 沒有提供指定二元搜尋的方法。以下是一個效能提升的例子,對於這個陣列大小,使用直譯式 PHP 可以提升大約 50 倍。如果內建此功能,對於這個陣列大小,可能可以達到大約 1000 倍的提升。

<?php

// Set up sorted array
$X = array(1);
for (
$j = 1; $j < 50000; ++$j)
$X[] = $X[$j - 1] + rand(1, 6);

// Using in_array
$x = -microtime(true);
$m = 0;
for (
$j = 0; $j < 10000; ++$j)
$m += in_array(rand(1, 175000), $X);
$x += microtime(true);
echo
$x.PHP_EOL;

// Using binarySearch
$x = -microtime(true);
$m = 0;
for (
$j = 0; $j < 10000; ++$j)
$m += binarySearch($X, rand(1, 175000));
$x += microtime(true);
echo
$x.PHP_EOL;

function
binarySearch($array, $value) {
$low = 0;
$high = count($array) - 1;
while (
$low <= $high) {
$pivot = floor(($low + $high) / 2);
if (
$array[$pivot] == $value)
return
true;
if (
$value < $array[$pivot])
$high = $pivot - 1;
else
$low = $pivot + 1;
}
// No match
return false;
}

/* Sample outputs, first is in_array, second is binarySearch
1.3544600009918
0.026464939117432

1.6158990859985
0.033976078033447

1.5184400081635
0.026461124420166
*/
Armands Rieksti
1 年前
我想指出的是,如果您使用列舉 (Enum) 資料結構,並且想要比較字串陣列中是否包含某個字串列舉值,您需要將其轉換為字串。

根據我的測試,該函數在以下情況下可以正常運作:
如果陣列中填滿了字串,而您正在搜尋一個字串;
如果陣列中填滿了列舉值,而您正在搜尋一個列舉值。
To Top