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 之前,string 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 in_array() 使用数组作为 needle

<?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() - 检查数组中是否存在给定的键或索引

添加笔记

用户贡献笔记 8 个笔记

409
beingmrkenny at gmail dot com
12 年前
在使用某些数组时,松散检查会返回一些疯狂的、违反直觉的结果。由于 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

?>
2
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;
}
8
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:顺序无关紧要 *仅当* 不处于严格模式下。
1
leonhard dot radonic+phpnet at gmail dot com
1 年前
我在使用 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。

我花了相当长的时间才找出问题所在。
-2
Armands Rieksti
1 年前
我想指出,如果您使用 Enum 数据结构,并且想要比较一个字符串数组是否包含某个字符串 Enum,则需要将其转换为字符串。

根据我的测试,该函数工作正常
如果数组中填充了字符串,而您正在搜索一个字符串;
如果数组中填充了 Enum,而您正在搜索一个 Enum。
-8
thomas dot sahlin at gmail dot com
14 年前
如果您自己创建了一个数组,然后使用 in_array 搜索它,请考虑设置数组的键并使用 isset,因为它速度更快。

<?php

$slow
= array('apple', 'banana', 'orange');

if (
in_array('banana', $slow))
print(
'Found it!');

$fast = array('apple' => 'apple', 'banana' => 'banana', 'orange' => 'orange');

if (isset(
$fast['banana']))
print(
'Found it!');

?>
-5
Anonymous
1 年前
$a = new StdClass();
$b = new StdClass();

// 预期:false,实际:true
var_dump(in_array($a, [$b]));
// bool(true)

// 正常工作
var_dump(in_array($a, [$b], true));
// bool(false)
-23
Anonymous
1 年前
$a = new StdClass();
$b = new StdClass();

// 预期:false,实际:true
var_dump(in_array($a, [$b]));
// bool(true)

// 正常工作
var_dump(in_array($a, [$b], true));
// bool(false)
To Top