У меня 2 массива:
$fruits = array(
'Apple' => array('id' => 1),
'Banana' => array('id' => 2),
'Peach' => array('id' => 3)
);
$carts = array(
'Olivia' => array(51, 3, 2),
'Harry' => array(312, 314, 10),
'Charlie' => array(1, 314, 626)
);
Я хочу написать что-нибудь, если в корзине есть какой-нибудь фрукт. У меня есть этот код, и он работает.
foreach ($carts as $cart) {
$boughtFruit = false;
foreach ($fruits as $fruit) {
if (in_array($fruit['id'], $cart)) {
echo "Fruit <br>";
$boughtFruit = true;
break;
}
}
if(!$boughtFruit){
echo "No Fruit <br>";
}
}
вернуть:
Fruit
No fruit
Fruit
Мне не нравится мое решение, потому что мне нужно использовать переменную поддержки $boughtFruit
и 2 foreach.
Не могли бы вы предложить мне тот же код, используя PHP
функция (если она существует) и без$boughtFruit
?
Вам не нужно внутренний цикл, вместо этого используйте array_intersect()
чтобы найти то же значение в массивах.
$fru = array_column($fruits, "id");
foreach ($carts as $cart) {
echo count(array_intersect($cart, $fru)) ? "Fruit <br>" : "No Fruit <br>";
}
Проверить результат в демонстрация
Также, если вы хотите получить название подходящего фрукта, используйте этот код
$fru = array_map(function($item){return $item['id'];}, $fruits);
foreach ($carts as $cart) {
$find = array_intersect($cart, $fru);
if (count($find)){
$result = implode(", ", array_map(function($item) use($fru){
return array_search($item, $fru);
}, $find));
echo "Fruit ({$result})\n";
} else
echo "No Fruit \n";
}
Выход:
Fruit (Peach, Banana)
No Fruit
Fruit (Apple)
Проверить результат в демонстрация
Других решений пока нет …