Функция in_array() проверяет, находится ли значение в массиве.
Простой пример:
$fruits = ['apple', 'banana', 'cherry'];
if (in_array('banana', $fruits)) {
echo "Found!";
} else {
echo "Not found.";
}
// Вывод: Found!
Важность $strict
$numbers = [1, 2, 3];
var_dump(in_array('1', $numbers)); // true (без strict, сравнение как ==)
var_dump(in_array('1', $numbers, true)); // false (strict === сравнение по типу)
Пример 1 — права доступа
$allowed_roles = ['admin', 'editor'];
$user_role = 'editor';
if (in_array($user_role, $allowed_roles)) {
echo "Access granted";
} else {
echo "Access denied";
}
Пример 2 — фильтрация:
$input = ['apple', 'carrot', 'banana', 'potato'];
$fruits = ['apple', 'banana', 'cherry'];
$only_fruits = array_filter($input, function($item) use ($fruits) {
return in_array($item, $fruits);
});
print_r($only_fruits);
// ['apple', 'banana']
Задачи
1. in_array() с ассоциативным массивом
$person = [
'name' => 'Alice',
'role' => 'admin',
'status' => 'active',
];
if (in_array('admin', $person)) {
echo "User is admin";
} else {
echo "Not admin";
}
in_array() работает с значениями, не с ключами. То есть role нас не интересует — важно, что 'admin' есть среди значений.
2. in_array() с многомерным массивом
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 3, 'name' => 'Charlie'],
];
if (in_array(['id' => 2, 'name' => 'Bob'], $users)) {
echo "Found!";
} else {
echo "Not found.";
}
❌ Это не сработает, потому что in_array() сравнивает всю вложенность массива, и если в массиве есть хоть одна отличающаяся часть — он скажет “не найдено”.
✅ Лучше искать по отдельным значениям:
$ids = array_column($users, 'id');
if (in_array(2, $ids)) {
echo "User with ID 2 found!";
}
3. in_array() + use() (с фильтрацией)
Представим, что у нас есть список товаров, и мы хотим оставить только те, которые входят в “разрешённый список”.
$products = [
['name' => 'iPhone', 'category' => 'electronics'],
['name' => 'Banana', 'category' => 'food'],
['name' => 'TV', 'category' => 'electronics'],
['name' => 'Bread', 'category' => 'food'],
];
$allowed_categories = ['electronics'];
$filtered = array_filter($products, function($product) use ($allowed_categories) {
return in_array($product['category'], $allowed_categories);
});
print_r($filtered);
// Вывод
Array
(
[0] => Array
(
[name] => iPhone
[category] => electronics
)
[2] => Array
(
[name] => TV
[category] => electronics
)
)
Мои ошибки
<?php
$cars = [
['brand' => 'Ford', 'model' => 'Mustang', 'year' => 2020],
['brand' => 'Ford', 'model' => 'Fusion', 'year' => 2018],
['brand' => 'Ford', 'model' => 'Mustang', 'year' => 2020],
['brand' => 'Toyota', 'model' => 'Corolla', 'year' => 2019],
['brand' => 'Ford', 'model' => 'Escape', 'year' => 2021],
['brand' => 'Toyota', 'model' => 'Camry', 'year' => 2018],
];
// Удали дубликаты машин с одинаковыми 'model' и 'year'.
$result = array_reduce($cars, function($newArr, $car) {
if (!in_array($car['model'], $newArr) || !in_array($car['model'], $newArr)) {
$newArr[] = $car;
}
}, []);
print_r($result);
ошибка:
Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given in /home/user/scripts/code.php:15
Stack trace:
#0 /home/user/scripts/code.php(15): in_array('Fusion', NULL)
#1 [internal function]: {closure}(NULL, Array)
#2 /home/user/scripts/code.php(14): array_reduce(Array, Object(Closure), Array)
#3 {main}
thrown in /home/user/scripts/code.php on line 15
in_array($car[‘model’], …) — ❌ не сработает с массивом массивов
Ты сравниваешь строку ($car['model']) со списком массивов, а in_array не умеет искать 'Mustang' в массиве типа:
[
['model' => 'Mustang'],
['model' => 'Fusion']
]
in_array("abc", ["abc", "def"]) → true
in_array отлично сравнивает строку со строками, число с числами, булевое с булевым и т.д.
Но! — in_array(“abc”, [[“model” => “abc”]]) → false
Если ты сравниваешь строку с массивами — in_array не будет “залазить внутрь” массивов:
$car = "Mustang";
$arr = [
["model" => "Mustang"],
["model" => "Fusion"]
];
in_array($car, $arr); // ❌ false
Потому что in_array сравнивает **$car == [“model” => “Mustang”]**, а это сравнение строки с массивом → false`.
🔧 Чтобы сравнить "Mustang" с ['model' => 'Mustang'] внутри массива, то надо сделать так чтобы мы сравнивали строки.
Смотри здесь.
