Укоротить/упростить функцию PHP
Функция check принимает 2 массива:
- Товары с количеством на складе
- Выбранные склады
Результатом ее выполнения должно быть:
true, если все товары присутствуют хоть в одном из выбранных складов.
false, если хоть один товар из массива не находиться не в одном из выбранных складов
Уверен что можно проще как то это все сопоставить, но кроме как переборами я не придумал, какие есть альтернативы?
check($params, array $restrictionParams,)
{
$goodStore = null;
foreach ($params['ITEMS_STORE'] as $itemId => $stores) {
foreach ($stores as $arStore) {
if ($arStore['PRODUCT_AMOUNT'] > 0) {
$goodStore[$arStore['ELEMENT_ID']][$arStore['ID']] = true;
}
}
}
$check = null;
foreach ($restrictionParams['AVAIL_STORE'] as $needId) {
foreach ($goodStore as $itemId => $arStore) {
if(array_key_exists($needId, $arStore)) {
$check[$itemId][$needId] = true;
}else{
$check[$itemId][$needId] = false;
}
}
}
foreach ($check as $itemId => $Store) {
if(in_array(true, $Store)) {
$check[$itemId] = true;
}else{
$check[$itemId] = false;
}
}
if (in_array(false,$check)) {
return false;
}else{
return true;
}
}
Ответы (1 шт):
Автор решения: Sanya H
→ Ссылка
Что-то мне кажется, что Ваш код не соответствует описанию. Но возможно я описание не правильно понял. А Ваш код (функцию) можно сократить до такого вида:
function check($params, array $restrictionParams)
{
foreach ($params['ITEMS_STORE'] as $itemId => $stores) {
foreach ($stores as $arStore) {
if ($arStore['PRODUCT_AMOUNT'] > 0
&& in_array($arStore['ID'], $restrictionParams['AVAIL_STORE'])
) {
//хотя бы один товар нашелся, посему можно следующий ITEMS_STORE смотреть
continue 2;
}
}
// в текущем ITEMS_STORE отсутствуют товары с перечня AVAIL_STORE,
// что не удовлетворяет условию задачи, посему нету смысла дальше продолжать
return false;
}
return true;
}
Ссылка на сандбокс с добавленной этой функцией (check2) для теста - http://sandbox.onlinephpfunctions.com/code/33f58a5fed9ba3e70ea440b3cf56ce30a8ca2674