【问题标题】:PHP filter JSON array with $_POST arrayPHP 过滤 JSON 数组与 $_POST 数组
【发布时间】:2020-10-30 17:55:32
【问题描述】:

我目前有一个包含车辆信息的 json 文件:

{ “存货”: [{ “id”:“1”, "StockNumber": "1000", “制造”:“福特”, “模型”:“野马”, “修剪”:“GT”, “年份”:“2011”, “红色”, “气缸”:“8”, “传输”:“手动” }, { “id”:“2”, "StockNumber": "1001", “制造”:“福特”, “模型”:“野马”, “修剪”:“GT”, “年份”:“2012”, “颜色”:“黄色”, “气缸”:“8”, “变速箱”:“自动” }, { “id”:“3”, "StockNumber": "1002", “制造”:“雪佛兰”, “型号”:“卡马罗”, “修剪”:“ZL1”, “年”:“2020”, “红色”, “气缸”:“8”, “传输”:“手动” }] }

我试图让复选框按品牌、型号、年份、颜色等过滤结果。从选择页面,我得到复选框的值,并将其传递给搜索 php 页面。这是传递给搜索页面的数组。

['Model' => ['Mustang', 'Camaro'],'Color' => ['Red']];

这应该返回 2 个结果,一个红色 Mustang 和一个红色 Camaro。

如果我使用array_filter,在选择福特之后,雪佛兰车辆现在被过滤掉了。所以我可以选择福特和红色,我会得到预期的结果。但是,现在我无法选择雪佛兰,因为它已被过滤掉。所以我看不到红色的福特和雪佛兰汽车。我得到一个结果,一辆红色野马。

如果我尝试使用 array_push 将车辆添加到结果数组,我可以添加福特和雪佛兰,但选择红色不会过滤掉黄色野马,因为黄色野马是福特,并且符合该标准。我得到 3 个结果,1 个红色 Mustang、1 个黄色 Mustang 和 1 个红色 Camaro。

我正在努力使用传入的数组过滤 json 结果的逻辑。似乎我需要"or" 传入的多个品牌和"and" 每个类别。福特或雪佛兰和红色。另一个例子可能是:Ford OR Chevy AND Red OR Yellow AND Manual。

我已经根据下面的回复更新了代码:

$make = ['Mustang', 'Camaro'];
$color = ['Red'];

$result = [];

   foreach ($dataSource as $k => $data) {
   
      foreach ($posts as $postKey => $postValue) {
    
     
     // This does not.  Only filters on last array in loop
     if (array_key_exists($postKey, $data) && in_array($data[$postKey], 
     $postValue)) {
    
      $result[$k] = $data;
        } else {
      unset($result[$k]);
            }
         }
       }
     }

如何以静态示例的方式根据数组条件动态过滤此数组?

【问题讨论】:

  • 为什么不能选择数据库?它们显然是为此目的而制造的。
  • 因为有时你必须使用你所拥有的。

标签: php json search filter


【解决方案1】:

你需要将post数组转换成这种结构,以便于处理

 $posts = [
        'Model' => ['Mustang', 'Camero'],
        'Color' => ['Red']
    ];

然后使用 foreach 过滤器:

        $carJson = '{
    "Inventory": [{
            "id": "1",
            "StockNumber": "1000",
            "Make": "Ford",
            "Model": "Mustang",
            "Trim": "GT",
            "Year": "2011",
            "Color": "Red",
            "Cylinders": "8",
            "Transmission": "Manual"
        }, {
            "id": "2",
            "StockNumber": "1001",
            "Make": "Ford",
            "Model": "Mustang",
            "Trim": "GT",
            "Year": "2012",
            "Color": "Yellow",
            "Cylinders": "8",
            "Transmission": "Automatic"
        }, {
            "id": "3",
            "StockNumber": "1002",
            "Make": "Chevy",
            "Model": "Camaro",
            "Trim": "ZL1",
            "Year": "2020",
            "Color": "Red",
            "Cylinders": "8",
            "Transmission": "Manual"
        },
        {
            "id": "4",
            "StockNumber": "1005",
            "Make": "Chevy",
            "Model": "VW",
            "Trim": "ZL1",
            "Year": "2020",
            "Color": "Red",
            "Cylinders": "8",
            "Transmission": "Manual"
        }]
}';
    $cars = json_decode($carJson, true)['Inventory'];


    $posts = [
        'Model' => ['Mustang', 'Camero'],
        'Color' => ['Red']
    ];

    $result = [];

    foreach ($posts as $postKey => $postValue) {
        foreach ($cars as $k => $car) {
            if (array_key_exists($postKey, $car) && in_array($car[$postKey], $postValue)) {
                $result[$k] = $car;
            } else {
                unset($cars[$k]);
                unset($result[$k]);
            }
        }
    }

    print_r($result);

【讨论】:

  • 很抱歉,但经过测试,我注意到这只过滤了最后一个数组项。它只过滤 Color=Red,忽略 Mustang 和 Camaro。 '模型' => ['Mustang','Camaro'],'颜色' => ['红色']。添加另一辆红色车辆(例如红色大众)也将包含在结果中。
  • 请检查 $result
猜你喜欢
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2012-04-22
  • 2018-05-04
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多