Glossary overview

In_array

Функция 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'] внутри массива, то надо сделать так чтобы мы сравнивали строки.

Смотри здесь.