Фабула
$products = [
['name' => 'Laptop', 'category' => 'Electronics', 'price' => 1200, 'rating' => 4.5],
['name' => 'Vacuum', 'category' => 'Home', 'price' => 200, 'rating' => 4.0],
['name' => 'Headphones', 'category' => 'Electronics', 'price' => 150, 'rating' => 4.8],
['name' => 'Blender', 'category' => 'Home', 'price' => 100, 'rating' => 3.9],
['name' => 'Monitor', 'category' => 'Electronics', 'price' => 300, 'rating' => 4.3],
];
Напиши функцию filterByCategory(array $products, string $category) — возвращает только продукты из нужной категории.
Решение с foreach
<?php
$products = [
['name' => 'Laptop', 'category' => 'Electronics', 'price' => 1200, 'rating' => 4.5],
['name' => 'Vacuum', 'category' => 'Home', 'price' => 200, 'rating' => 4.0],
['name' => 'Headphones', 'category' => 'Electronics', 'price' => 150, 'rating' => 4.8],
['name' => 'Blender', 'category' => 'Home', 'price' => 100, 'rating' => 3.9],
['name' => 'Monitor', 'category' => 'Electronics', 'price' => 300, 'rating' => 4.3],
];
function filterByCategory($products, $category) {
$filtered = [];
foreach($products as $product) {
if ($product['category'] == $category) {
$filtered[] = $product;
}
}
return $filtered;
}
$result = filterByCategory($products, 'Home');
print_r($result);
// Вывод
Array
(
[0] => Array
(
[name] => Vacuum
[category] => Home
[price] => 200
[rating] => 4
)
[1] => Array
(
[name] => Blender
[category] => Home
[price] => 100
[rating] => 3.9
)
)
Альтернативные подходы:
array_filter()
Используется для фильтрации массива по условию, возвращает только те элементы, которые прошли проверку.array_map()
Позволяет изменить каждый элемент массива. Не для фильтрации, но можно использовать вместе сfilter.array_reduce()
Сложная, но мощная функция — можно использовать для фильтрации и одновременно сбора/агрегации данных.array_column()+array_search()/array_keys()
Можно использовать для извлечения значений из столбца, а потом находить индексы подходящих записей.usort()
Полезна, если ты хочешь отсортировать уже отфильтрованный массив, например — поrating.
Решение с array_filter()
<?php
$products = [
['name' => 'Laptop', 'category' => 'Electronics', 'price' => 1200, 'rating' => 4.5],
['name' => 'Vacuum', 'category' => 'Home', 'price' => 200, 'rating' => 4.0],
['name' => 'Headphones', 'category' => 'Electronics', 'price' => 150, 'rating' => 4.8],
['name' => 'Blender', 'category' => 'Home', 'price' => 100, 'rating' => 3.9],
['name' => 'Monitor', 'category' => 'Electronics', 'price' => 300, 'rating' => 4.3],
];
function filterByCategory($products, $category) {
$result = array_filter($products, function($product) {
return $product['category'] == $category;
});
return $result;
}
$result = filterByCategory($products, 'Electronics');
print_r($result);
Но получаю ошибку:
Warning: Undefined variable $category in /home/user/scripts/code.php on line 15
Warning: Undefined variable $category in /home/user/scripts/code.php on line 15
Warning: Undefined variable $category in /home/user/scripts/code.php on line 15
Warning: Undefined variable $category in /home/user/scripts/code.php on line 15
Warning: Undefined variable $category in /home/user/scripts/code.php on line 15
Причина ошибки:
Не забудь в анонимной функции передать $category через use, иначе она его “не увидит”.
Про use читай тут.
function filterByCategory($products, $category) {
$result = array_filter($products, function($product) use($category) {
return $product['category'] == $category;
});
return $result;
}
$result = filterByCategory($products, 'Electronics');
print_r($result);
// Вывод
Array
(
[0] => Array
(
[name] => Laptop
[category] => Electronics
[price] => 1200
[rating] => 4.5
)
[2] => Array
(
[name] => Headphones
[category] => Electronics
[price] => 150
[rating] => 4.8
)
[4] => Array
(
[name] => Monitor
[category] => Electronics
[price] => 300
[rating] => 4.3
)
)
Теперь работает.