PHP фильтр JSON массив с массивом $ _POST - PullRequest
0 голосов
/ 10 июля 2020

В настоящее время у меня есть файл json, содержащий информацию о транспортном средстве:


{
    "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"
        }]
}

Я пытаюсь установить флажки для фильтрации результатов по марке, модели, году, цвету и т. Д. c ... На странице выбора я получаю значение флажков и передаю его на страницу поиска php. Это массив, который передается на страницу поиска.

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

Это должно вернуть 2 результата: красный Mustang и красный Camaro.

Если я использую array_filter, после выбора Ford автомобили Chevy будут отфильтрованы. Так что я могу выбрать Ford и Red, я бы получил один результат, как и ожидал. Однако сейчас я не могу выбрать Chevy, так как он был отфильтрован. Поэтому я не вижу красных автомобилей Ford и Chevy. Я получаю один результат - красный Mustang.

Если я попытаюсь добавить автомобили в массив результатов с помощью array_pu sh, я могу добавить Ford и Chevy, но выбор красного цвета не отфильтрует желтый Mustang, потому что желтый Мустанг - это Форд, и он соответствует этим критериям. Я получаю 3 результата: 1 красный Mustang, 1 желтый Mustang и 1 красный Camaro.

Я борюсь с logi c, чтобы отфильтровать результаты json, используя переданный массив. Кажется Мне нужно "or" несколько переданных марок и "and" в каждой категории. Форд ИЛИ Шевроле И Красный. Другим примером может быть: Ford ИЛИ Chevy И Красный ИЛИ Желтый И Руководство.

Я обновил код на основе ответа ниже:

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

Как мне отфильтровать этот массив на основе критерии массива динамически таким образом, чтобы пример stati c работал?

1 Ответ

2 голосов
/ 10 июля 2020

Вам нужно преобразовать массив сообщений в эту структуру для упрощения обработки

 $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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...