PHP 8.4.1 Released!

in_array

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

in_arrayПроверяет, существует ли значение в массиве

Описание

in_array(mixed $needle, array $haystack, bool $strict = false): bool

Функция выполняет поиск значения needle в массиве haystack. Функция сравнивает значения в нестрогом режиме, если только строгий режим не установили через параметр strict.

Список параметров

needle

Искомое значение.

Замечание:

Функция сравнивает значения с учётом регистра, если значение needle — строка.

haystack

Массив.

strict

Функция in_array() также сопоставит типы значения needle со значениями в массиве haystack, если для третьего параметра strict установили значение true.

Замечание:

До PHP 8.0.0 в нестрогом режиме функция считала значение параметра needle частью массива, если искомое значение принадлежало типу string, а массив содержал целочисленное значение 0, и наоборот. Такое «соответствие» давало нежелательный результат. Аналогичные пограничные случаи встречаются и для других типов. Лучше предпочесть и установить через флаг strict строгий режим, чтобы избежать неожиданного поведения в случаях, когда невозможно достоверно установить типы значений.

Возвращаемые значения

Функция возвращает true, если нашла значение needle в массиве, иначе false.

Примеры

Пример #1 Пример использования функции in_array()

<?php

$os
= array("Mac", "NT", "Irix", "Linux");

if (
in_array("Irix", $os)) {
echo
"Функция нашла значение 'Irix'";
}

if (
in_array("mac", $os)) {
echo
"Функция нашла значение 'mac'";
}

?>

Функция in_array() не найдёт второго совпадения, потому что чувствительна к регистру, поэтому приведённая программа выведет:

Функция нашла значение 'Irix'

Пример #2 Пример использования функции in_array() с параметром strict

<?php

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

if (
in_array('12.4', $a, true)) {
echo
"Функция нашла значение '12.4' при строгой проверке\n";
}

if (
in_array(1.13, $a, true)) {
echo
"Функция нашла значение '1.13' при строгой проверке\n";
}

?>

Результат выполнения приведённого примера:

Функция нашла значение '1.13' при строгой проверке

Пример #3 Пример использования функции in_array() с массивом в качестве аргумента needle

<?php

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

if (
in_array(array('p', 'h'), $a)) {
echo
"Функция нашла значение 'ph'\n";
}

if (
in_array(array('f', 'i'), $a)) {
echo
"Функция нашла значение 'fi'\n";
}

if (
in_array('o', $a)) {
echo
"Функция нашла значение 'o'\n";
}

?>

Результат выполнения приведённого примера:

Функция нашла значение 'ph'
Функция нашла значение 'o'

Смотрите также

  • array_search() - Ищет значение в массиве и в случае успешного поиска возвращает ключ первого найденного элемента
  • isset() - Определяет, объявили ли переменную и отличается ли её значение от null
  • array_key_exists() - Проверяет, существует ли в массиве заданный ключ или индекс

Добавить

Примечания пользователей 5 notes

up
411
beingmrkenny at gmail dot com
13 years ago
Loose checking returns some crazy, counter-intuitive results when used with certain arrays. It is completely correct behaviour, due to PHP's leniency on variable types, but in "real-life" is almost useless.

The solution is to use the strict checking option.

<?php

// Example array

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

// Loose checking -- return values are in comments

// First three make sense, last four do not

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

// Strict checking

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

?>
up
3
Julian Sawicki
1 year ago
Here is a recursive in_array function:

<?php

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

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

// Let's try to find number 7 within $array
$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;
}
up
10
rhill at xenu-directory dot net
15 years ago
I found out that in_array will *not* find an associative array within a haystack of associative arrays in strict mode if the keys were not generated in the *same order*:

<?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';
// Output is 'false'

echo in_array($needle, $haystack) ? 'true' : 'false';
// Output is 'true'

?>

I had wrongly assumed the order of the items in an associative array were irrelevant, regardless of whether 'strict' is TRUE or FALSE: The order is irrelevant *only* if not in strict mode.
up
1
leonhard dot radonic+phpnet at gmail dot com
2 years ago
I got an unexpected behavior working with in_array. I'm using following code:

<?php
// ...
$someId = getSomeId(); // it gets generated/fetched by another service, so I don't know what value it will have. P.S.: it's an integer

// The actual data in my edge-case scenario:
// $someId = 0;
// $anyArray = ['dataOne', 'dataTwo'];
if (in_array($someId, $anyArray)) {
// do some work
}
// ...
?>

With PHP7.4, in_array returns boolean true.
With PHP8.1, in_array returns boolean false.

It took me quite some time to find out what's going on.
up
-4
Armands Rieksti
1 year ago
I'd like to point out that, if you're using Enum data structures and want to compare whether an array of strings has a certain string Enum in it, you need to cast it to a string.

From what I've tested, the function works correctly:
if the array is filled with strings and you're searching for a string;
if the array is filled with Enums and you're searching for an Enum.
To Top