PHP Conference Japan 2024

in_array

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

in_array检查数组中是否存在某个值

描述

in_array(混合 $needle, 数组 $haystack, 布尔值 $strict = false): 布尔值

除非设置了 $strict,否则使用宽松比较在 $haystack 中搜索 $needle

参数

needle

要搜索的值。

注意:

如果 $needle 是字符串,则比较区分大小写。

haystack

数组。

strict

如果第三个参数 $strict 设置为 true,则 in_array() 函数还会检查 $haystack$needle类型

注意:

在 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 将数组作为 $needlein_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 在严格模式下 *不会* 在关联数组的堆栈中找到关联数组,如果键的生成顺序不同。

<?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'

?>

我错误地假设关联数组中项目的顺序无关紧要,无论 'strict' 是否为 TRUE 或 FALSE:只有在非严格模式下,顺序才无关紧要。
leonhard dot radonic+phpnet at gmail dot com
2 年前
我在使用 in_array 时遇到了意外的行为。我正在使用以下代码

<?php
// ...
$someId = getSomeId(); // 它由另一个服务生成/获取,所以我不知道它的值是什么。附注:它是一个整数

// 在我的边缘情况场景中的实际数据:
// $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

// 设置排序数组
$X = array(1);
for (
$j = 1; $j < 50000; ++$j)
$X[] = $X[$j - 1] + rand(1, 6);

// 使用 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;

// 使用 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;
}
// 没有匹配项
return false;
}

/* 示例输出,第一个是 in_array,第二个是 binarySearch
1.3544600009918
0.026464939117432

1.6158990859985
0.033976078033447

1.5184400081635
0.026461124420166
*/
Armands Rieksti
1 年前
我想指出,如果您正在使用枚举数据结构并想要比较字符串数组是否包含某个字符串枚举,则需要将其强制转换为字符串。

根据我的测试,该函数工作正常
如果数组填充了字符串并且您正在搜索字符串;
如果数组填充了枚举并且您正在搜索枚举。
To Top