PHP-根据每个对象内部的数组值过滤对象

时间:2019-03-07 17:10:19

标签: php

我有一个对象数组,其中每个对象都包含一个属性数组

$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;
}

只是想知道是否还有更直接的方法。

谢谢。

2 个答案:

答案 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”的索引。