Filter assoc array 2
Glossary overview

Filter assoc array 2

Фабула

$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
        )

)

Альтернативные подходы:

  1. array_filter()
    Используется для фильтрации массива по условию, возвращает только те элементы, которые прошли проверку.
  2. array_map()
    Позволяет изменить каждый элемент массива. Не для фильтрации, но можно использовать вместе с filter.
  3. array_reduce()
    Сложная, но мощная функция — можно использовать для фильтрации и одновременно сбора/агрегации данных.
  4. array_column() + array_search() / array_keys()
    Можно использовать для извлечения значений из столбца, а потом находить индексы подходящих записей.
  5. 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
        )

)

Теперь работает.