Php 如果键已经存在,如何将键/值对作为分隔元素推送到数组中?
这就是easticsearch查询逻辑的全部内容。。。我需要使用如下数组发送查询:Php 如果键已经存在,如何将键/值对作为分隔元素推送到数组中?,php,arrays,loops,multidimensional-array,foreach,Php,Arrays,Loops,Multidimensional Array,Foreach,这就是easticsearch查询逻辑的全部内容。。。我需要使用如下数组发送查询: `"query" => array:2 [▼ "match" => array:2 [▼ "location" => array:2 [▼ "query" => "USA" ], "match" => array:2 [▼ "car" => array:2 [▼ "query" => "F
`"query" => array:2 [▼
"match" => array:2 [▼
"location" => array:2 [▼
"query" => "USA"
],
"match" => array:2 [▼
"car" => array:2 [▼
"query" => "FORD" ]
]
]`
当我们试图生成具有相同密钥的数组时,问题就开始了:
$rules['query'] = [];
foreach ($field_value_array as $key => $value) {
$match['match'][$key] = [
'query' => $value ];
$rules['query'] = $match;
}
PHP会自动删除它们,只留下最后一个。在这种情况下,array_push函数不起作用
你是我最后的希望。在
“query”
数组中不能有两个“match”
键
然后,您缺少[]
到$rules['query']=$match代码>,因此,最后一个值将覆盖上一个值,您将只获得最后一个值
最后,您将通过使用['query'=>$value]
获得一个额外的“索引”,您可以使用$match['match'][$key]['query']=$value代码>
您可以尝试以下方法:
$field_value_array=['location' => 'USA','cars' => 'FORD'];
$rules['query'] = [];
foreach ($field_value_array as $key => $value) {
$match=[]; // reset $match to avoid duplicate keys
$match['match'][$key]['query'] = $value;
$rules['query'][] = $match;
}
print_r($rules);
将提供以下产出:
Array (
[query] => Array (
[0] => Array (
[match] => Array (
[location] => Array (
[query] => USA
)
)
)
[1] => Array (
[match] => Array (
[cars] => Array (
[query] => FORD
)
)
)
)
)
在“查询”
数组中不能有两个“匹配”
键。你的意思是:“query”=>[0=>['match'=>[…],1=>['match'=>[…]
?Syscall是正确的。您不能有重复的密钥。请参阅答案。非常感谢!但最大的挑战是弹性服务器只接受提到的结构。我猜他们正在考虑API的js实现,但对于json对象也是不可能的……如果我将手动编写此数组,它将正常工作:
['match'=>['location'=>['query'=>'USA']],'match'=>['car'=>['query'=>'AUDI']],]`但是我想用foreach生成这样的数组是不可能的:(最糟糕的变体是使用switch
,但这不是很好的做法…@VladislavPanin谢谢你的回答。很有趣。我认为用PHP编写这样的数组是不可能的。$data=['query'=>['match'=>['test'],'match'=>['test2']];print\r($data)
将只输出一个匹配
键。您如何编写它?我刚刚发送了它,就像它一样…无论如何,我找到了让多字段过滤器工作的方法。但这对我来说仍然是一件神秘的事情。即使打印
合并这个数组,并且只提供一个唯一的键。所以他们如何读取该数组仍然是一个悬而未决的问题。我认为最好的方法是写下它们,然后问开发人员……这很有趣:)