我有一个对象数组,其中每个对象都包含一个属性数组
$cars = [
"toyota" => ["colors" => ["red","blue"]],
"mazda" => ["colors" => ["red"]],
"honda" => ["colors" => ["blue"]],
"nissan" => ["colors" => ["red","yellow"]],
];
我需要一个函数来返回所有具有指定颜色的汽车。
我可以使用foreach循环来做到这一点。
function getCarsByColor(string $color, array $cars){
foreach($cars as $key => $car){
if(!in_array($color, $car['colors'])){
unset($cars[$key]);
}
}
return $cars;
}
只是想知道是否还有更直接的方法。
谢谢。
答案 0 :(得分:1)
此方法使用array_filter()
$red_cars = array_filter($cars, function($car) {
return in_array('red', $car['colors']);
});
作为功能
function get_cars_by_color(array $cars, string $color = '') {
return array_filter($cars, function($car) use ($color) {
return in_array($color, $car['colors']);
});
}
use()
将变量从当前作用域传递到闭包函数作用域。
答案 1 :(得分:0)
您所做的在概念上没有错。在这种特定情况下,实际上只有两个选择:1)修改阵列副本以删除不需要的条目(您现在要执行的操作),或2)创建仅包含所需条目的新阵列。随您选择吧,真的。我注意到的一件事:
if(!in_array($color, $car['color'])){
这可能是一个错字,但是根据您的数组定义,将没有名为“ color”的索引。