首页 > 解决方案 > PHP - 如何查询 JSON 文件的多个值?

问题描述

我正在使用纯 PHP 和 JS 构建 JSON 后端,不涉及 MySQKL,我需要知道是否可以多次查询相同的 JSON 键模式。

所以,这是我的 JSON 文件:

[
    {
        "id": "WWJaePyv9a",
        "string": "aaa",
        "number": 123.89,
        "aArray": [
            "aa",
            "bb",
            "cc"
        ],
        "bool": true,
        "geocoords": [
            "1.23456",
            "-33.76584"
        ]
    },
    {
        "id": "vXMv68ze8K",
        "string": "bbb",
        "number": 1.64,
        "aArray": [
            "yyy",
            "ppp"
        ],
        "bool": false,
        "geocoords": [
            ""
        ]
    },
    {
        "id": "Imd6oPVYtP",
        "string": "ccc",
        "number": 0,
        "aArray": [
            ""
        ],
        "bool": false,
        "file": "",
        "geocoords": [
            ""
        ]
    }
]

这是我的 PHP 脚本:

<?php 
$className = basename(__DIR__) ;

/* GET variables */
$string = $_GET['string'];
$aArray = $_GET['aArray'];
$number = $_GET['number'];
$bool = $_GET['bool'];
if( $bool == 'true'){ $bool = true; } else if($bool == 'false'){ $bool= false; }


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

$results = array();

foreach ($data_array as $obj) {

    // check value in string
    if(isset($string)){
        if (strpos($obj['string'], $string) !== false) {
            // $results[$obj['id']] = $obj;
            array_push($results, $obj);
        }
    }

    // check element in array
    if(isset($aArray)){
        if (in_array($aArray, $obj['aArray'])) {
            // $results[$obj['id']] = $obj;
            array_push($results, $obj);

        } 
    }

     // check value in number
    if(isset($number)){
        if ($obj['number'] == (float)$number) {
            // $results[$obj['id']] = $obj;
            array_push($results, $obj);
        } 
    }

    // check value in bool
    if(isset($bool)){
        if ($obj['bool'] == $bool) {
            // $results[$obj['id']] = $obj;
            array_push($results, $obj);
        }
    }

}// ./ for

// echo results
echo json_encode(array_values($results), JSON_PRETTY_PRINT);
?>

这是我粘贴在 Chrome 中以测试 PHP 脚本的查询 URL:

https://example.com/query.php?string=aaa&string=bbb

不幸的是,我只得到我的 JSON 文件的最后一个数组对象,它具有“ bbb”作为“ string”键的值:

[ { "id": "vXMv68ze8K", "string": "bbb", "number": 1.64, "aArray": [ "yyy", "ppp" ], "bool": false, "geocoords": [ "" ] } ]

相反,我需要获取具有“ aaa”作为“”键的值的对象以及“ string”键的值bbb,如下所示:

[ 
   { "id": "WWJaePyv9a", "string": "aaa", "number": 123.89, "aArray": [ "aa", "bb", "cc" ], "bool": true, "geocoords": [ "1.23456", "-33.76584" ] 
   },
   { "id": "vXMv68ze8K", "string": "bbb", "number": 1.64, "aArray": [ "yyy", "ppp" ], "bool": false, "geocoords": [ "" ] 
   } 
]

这可能吗?我是在代码中做错了什么,还是在查询 URL 的语法中做错了什么?

标签: phparraysjson

解决方案


感谢对此问题的许多评论,我可以使用以下代码解决问题:

if(isset($string)){
        foreach ($string as $k=>$value) { 
            if ($obj['string'] == $value) { 
                array_push($results, $obj); 
            }  
        }
    }

    if(isset($number)){
        foreach ($number as $k=>$value) { 
            if ($obj['number'] == $value) { 
                array_push($results, $obj); 
            }  
        }
    }

    if(isset($aArray)){
        foreach ($aArray as $k=>$value) { 
            if (in_array($value, $obj['aArray'])) {
                array_push($results, $obj);
            }  
        }
    }

    if(isset($bool)){
        foreach ($bool as $k=>$value) { 
            if ($obj['bool'] == $value) { 
                array_push($results, $obj);
            }   
        }
    }

因此,使用这样的 URL:

https://example.com/query.php?string[]=aaa&string[]=ccc&aArray[]=ppp

使我能够得到我正在寻找的结果。


推荐阅读