Задача: Объединить заказы из двух складов и отфильтровать по количеству
Glossary overview

Задача: Объединить заказы из двух складов и отфильтровать по количеству

Фабула

У тебя есть два массива заказов с разных складов. Каждый заказ — ассоциативный массив с полями: id, product, quantity, warehouse.

$warehouseA = [
    ['id' => 1, 'product' => 'Mouse',     'quantity' => 5,  'warehouse' => 'A'],
    ['id' => 2, 'product' => 'Keyboard',  'quantity' => 2,  'warehouse' => 'A'],
    ['id' => 3, 'product' => 'Monitor',   'quantity' => 10, 'warehouse' => 'A'],
];

$warehouseB = [
    ['id' => 4, 'product' => 'Mouse',     'quantity' => 1,  'warehouse' => 'B'],
    ['id' => 5, 'product' => 'Laptop',    'quantity' => 3,  'warehouse' => 'B'],
    ['id' => 6, 'product' => 'Keyboard',  'quantity' => 7,  'warehouse' => 'B'],
];

Твоя задача:

  1. Объединить все заказы в один массив.
  2. Отфильтровать заказы, где quantity >= 5.
  3. Дополнительно (по желанию):
    • Отсортировать отфильтрованные заказы по price по убыванию.
    • Посчитать общее количество заказов после фильтрации.

Подсказки (без кода):

  • Для объединения массивов можно использовать: array_merge(), [...] + [...], или оператор spread в новых версиях.
  • Для фильтрации — array_filter().
  • Для сортировки — usort().
  • Для подсчёта — count() или array_reduce().

Решение

<?php

$warehouseA = [
    ['id' => 1, 'product' => 'Mouse',     'quantity' => 5,  'warehouse' => 'A', 'price' => 190],
    ['id' => 2, 'product' => 'Keyboard',  'quantity' => 2,  'warehouse' => 'A', 'price' => 320],
    ['id' => 3, 'product' => 'Monitor',   'quantity' => 10, 'warehouse' => 'A', 'price' => 1050],
];

$warehouseB = [
    ['id' => 4, 'product' => 'Mouse',     'quantity' => 5,  'warehouse' => 'B', 'price' => 550],
    ['id' => 5, 'product' => 'Laptop',    'quantity' => 4,  'warehouse' => 'B', 'price' => 340],
    ['id' => 6, 'product' => 'Keyboard',  'quantity' => 5,  'warehouse' => 'B', 'price' => 120],
];

$wareHouses = array_merge($warehouseA, $warehouseB);

$wareHousesFiltered = array_filter($wareHouses, function($wareHouse) {
	return $wareHouse['quantity'] == 5;
});

usort($wareHousesFiltered, function($a, $b) {
	return $a['price'] <=> $b['price']; // usort не возвращает отфильтрованный массив, поэтому нет смысла присваивать переменной результат
});

$warehouseQuantity = count($wareHousesFiltered); // 3

print_r($warehouseQuantity);

Review решения

✅ Что ты сделал хорошо:

  1. array_merge() — правильно объединил два массива.
  2. array_filter() — грамотно отфильтровал по количеству.
  3. usort() — сортировка по price работает отлично.
  4. count() — чётко считаешь количество отфильтрованных элементов.
  5. Комментарии в коде — nice touch, видно, что осмысленно пишешь.

⚠️ Мелкая ремарка по usort:

Ты добавил комментарий:

usort не возвращает отфильтрованный массив, поэтому нет смысла присваивать переменной результат

✔️ Это абсолютно верно — usort() меняет массив по ссылке, ничего не возвращает.
Но после него твой массив отсортирован — так что можно смело использовать его дальше.

Маленький апгрейд (по желанию):

Если хочешь, можешь добавить array_values() после array_filter() — чтобы сбросить ключи:

$wareHousesFiltered = array_filter($wareHouses, function($wareHouse) {
	return $wareHouse['quantity'] == 5;
});

print_r($wareHousesFiltered);

Сейчас после фильтрации ключи остались как и были, не обновились.

Array
(
    [0] => Array
        (
            [id] => 1
            [product] => Mouse
            [quantity] => 5
            [warehouse] => A
            [price] => 190
        )

    [3] => Array
        (
            [id] => 4
            [product] => Mouse
            [quantity] => 5
            [warehouse] => B
            [price] => 550
        )

    [5] => Array
        (
            [id] => 6
            [product] => Keyboard
            [quantity] => 5
            [warehouse] => B
            [price] => 120
        )

)

array_values() сбрасывает ключи.

$wareHousesFiltered = array_filter($wareHouses, function($wareHouse) {
	return $wareHouse['quantity'] == 5;
});

$updated_keys = array_values($wareHousesFiltered);

print_r($updated_keys);

// Вывод
Array
(
    [0] => Array
        (
            [id] => 1
            [product] => Mouse
            [quantity] => 5
            [warehouse] => A
            [price] => 190
        )

    [1] => Array
        (
            [id] => 4
            [product] => Mouse
            [quantity] => 5
            [warehouse] => B
            [price] => 550
        )

    [2] => Array
        (
            [id] => 6
            [product] => Keyboard
            [quantity] => 5
            [warehouse] => B
            [price] => 120
        )

)