PHP - сделать запрос к JSON файлу с условием AND - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь запросить некоторые данные из JSON файла с помощью PHP, я хочу получить объекты на основе string и number.

Вот мой JSON:

[
    {
        "id": "5V28tqJ1",
        "string": "john doe",
        "number": 1,
        "aArray": [
            "cc",
            "kk",
            "lo",
            "mm"
        ],
        "bool": false,
        "createdAt": "2020-01-02T15:16:11",
        "updatedAt": "2020-01-05T19:37:02"
    },
    {
        "id": "PMuKM818",
        "string": "sarah doe",
        "number": 2,
        "aArray": [
            "bb",
            "cc"
        ],
        "bool": true,
        "createdAt": "2020-01-02T16:16:23",
        "updatedAt": "2020-01-05T19:37:14"
    },
    {
        "id": "m8HSbEQe",
        "string": "bob smith",
        "number": 3,
        "aArray": [
            "dd",
            "ee",
            "ff"
        ],
        "bool": false,
        "createdAt": "2020-01-02T17:16:36",
        "updatedAt": "2020-01-05T19:37:32"
    }
]

Вот мой query-user.php скрипт:

<?php include 'header.php';
$string = $_GET['string'];
$aArray = $_GET['aArray'];
$number = $_GET['number'];
$bool = $_GET['bool'];

$data = file_get_contents($className. '.json');
$data = json_decode($data);

$results = array();

for ($i=0; $i<count($data); $i++) {

    // check value in string
    if(isset($string)){
        if (strpos($data[$i]->string, $string) !== false) {
            array_push($results, $data[$i]);
        }
    }

    // check element in array
    if(isset($aArray)){
        if (in_array($aArray, $data[$i]->aArray)) {
            array_push($results, $data[$i]);
        } 
    }

    // check value in number
    if(isset($number)){
        if (strpos($data[$i]->number, $number) !== false) {
            array_push($results, $data[$i]);
        } 
    }

    // check value in bool
    if(isset($bool)){
        if ($data[$i]->bool == $bool) {
            array_push($results, $data[$i]);
        }
    }

}// ./ for

echo json_encode($results, JSON_PRETTY_PRINT);
?>

В моем браузере я вызываю следующий URL:

http://example.com/users/query-user.php?string=doe&number=2

Вот что я получаю в результате:

[ 
{ "id": "5V28tqJ1", "string": "john doe", "number": 1, "aArray": [ "cc", "kk", "lo", "mm" ], "bool": false, "createdAt": "2020-01-02T15:16:11", "updatedAt": "2020-01-05T19:37:02" }, 
{ "id": "PMuKM818", "string": "sarah doe", "number": 2, "aArray": [ "bb", "cc" ], "bool": true, "createdAt": "2020-01-02T16:16:23", "updatedAt": "2020-01-05T19:37:14" },
{ "id": "PMuKM818", "string": "sarah doe", "number": 2, "aArray": [ "bb", "cc" ], "bool": true, "createdAt": "2020-01-02T16:16:23", "updatedAt": "2020-01-05T19:37:14" }
 ]

Как видите, я получаю объект с идентификатором PMuKM818 дважды, в то время как я должен получить его один раз вместе с первым объектом.

Что я делаю неправильно мой php код?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Объект с идентификатором PMuKM818 соответствует обоим параметрам вашего запроса: он содержит Doe и также имеет номер 2.

Если вы хотите предотвратить это, либо установите порядок приоритета для вашего фильтрует, используя if else операторы вместо простых if, или добавляет проверку существующих идентификаторов в результирующий массив перед добавлением элемента.

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Не самое элегантное решение, но оно делает то, что вам нужно:

foreach ($data as $details) {

    // check value in string
    if(isset($string)){
        if (strpos($details->string, $string) !== false) {
            $results[$details->id] = $details;
        }
    }

    // check element in array
    if(isset($aArray)){
        if (in_array($aArray, $details->aArray)) {
            $results[$details->id] = $details;
        } 
    }

    // check value in number
    if(isset($number)){
        if (strpos($details->number, $number) !== false) {
            $results[$details->id] = $details;
        } 
    }

    // check value in bool
    if(isset($bool)){
        if ($details->bool == $bool) {
            $results[$details->id] = $details;
        }
    }

}// ./ for

echo json_encode(array_values($results), JSON_PRETTY_PRINT);

Я также заменил for l oop на foreach, но это не должно повлиять на результат

1 голос
/ 06 января 2020

Для быстрого ответа вам просто нужно использовать: https://www.php.net/manual/en/function.array-column

Какой самый быстрый способ обработки json объектов.

ОБНОВЛЕНИЕ:

для полной верности вашего кода, пожалуйста, используйте: https://www.php.net/manual/en/function.array-search

в сочетании с array_column, каким образом вы будете искать быстрее, чем один за другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...