英文:
PHP - make query to JSON file with AND condition
问题
你的PHP代码中有一个小错误,导致了重复的结果。在处理number
参数时,你使用了strpos
函数,但number
应该是一个整数,而不是一个字符串,所以这里需要使用==
而不是strpos
来进行比较。以下是修复后的代码:
// check value in number
if(isset($number)){
if ($data[$i]->number == $number) {
array_push($results, $data[$i]);
}
}
通过这个更正,你应该能够获得正确的结果,不再出现重复的条目。
英文:
I’m trying to query some data from a JSON file with PHP, i want to get objects based on string
and number
.
Here’s my 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"
}
]
Here’s my query-user.php
script:
<?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);
?>
On my browser, I call the following url:
http://example.com/users/query-user.php?string=doe&number=2
Here’s what I get as result:
[
{ "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" }
]
As you can see, I get the object with ID PMuKM818
twice, while I should get it once, together with the first object.
What am I doing wrong in my php code?
答案1
得分: 1
以下是翻译好的部分:
For quick answer you just need to use: https://www.php.net/manual/en/function.array-column
What is fastest way to process json objects.
UPDATE:
for full your code correct please use: https://www.php.net/manual/en/function.array-search
combinate with array_column, what way you will search more faster then one by one.
英文:
For quick answer you just need to use: https://www.php.net/manual/en/function.array-column
What is fastest way to process json objects.
UPDATE:
for full your code correct please use: https://www.php.net/manual/en/function.array-search
combinate with array_column, what way you will search more faster then one by one.
答案2
得分: 1
The object with the ID PMuKM818
corresponds to both of your query parameters: it contains Doe and also has the number 2.
如果您要防止这种情况发生,可以使用 if else
语句来设置筛选器的优先顺序,而不是简单的 if
,或者在添加元素之前,在结果数组中添加现有的 ID 检查。
附加编辑
这不是最优雅的解决方案,但它可以满足您的需求:
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
循环替换为 foreach
,但这不应影响结果。
英文:
The object with the ID PMuKM818
corresponds to both of your query parameters: it contains Doe and also has the number 2.
If you want to prevent that, either set an order of precedence for your filters using if else
statements instead of simple if
, or add a check for existing ids in the resulting array before adding the element.
ADDITIONAL EDIT
Not the most elegant solution but it does what you need:
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);
I've also replaced the for
loop with a foreach
, but that should not impact on the result
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论