PHP 8.4.2 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() - Проверяет, существует ли в массиве заданный ключ или индекс

Добавить

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

up
414
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
11
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
3
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
1
eurorusty at yahoo dot ca
24 days ago
I'm not sure why PHP doesn't provide a way to specify a binary search. Here's an example of the performance gains, for this array size, about 50x improvement using interpreted PHP. If built in, it could probably achieve around 1000x improvement, again for this array size.

<?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
*/
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