Фабула
У тебя есть два массива заказов с разных складов. Каждый заказ — ассоциативный массив с полями: 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'],
];
Твоя задача:
- Объединить все заказы в один массив.
- Отфильтровать заказы, где
quantity >= 5. - Дополнительно (по желанию):
- Отсортировать отфильтрованные заказы по 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 решения
✅ Что ты сделал хорошо:
array_merge()— правильно объединил два массива.array_filter()— грамотно отфильтровал по количеству.usort()— сортировка поpriceработает отлично.count()— чётко считаешь количество отфильтрованных элементов.- Комментарии в коде — 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
)
)