Php 如果键已经存在,如何将键/值对作为分隔元素推送到数组中?

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

这就是easticsearch查询逻辑的全部内容。。。我需要使用如下数组发送查询:

`"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)
将只输出一个
匹配
键。您如何编写它?我刚刚发送了它,就像它一样…无论如何,我找到了让多字段过滤器工作的方法。但这对我来说仍然是一件神秘的事情。即使
打印
合并这个数组,并且只提供一个唯一的键。所以他们如何读取该数组仍然是一个悬而未决的问题。我认为最好的方法是写下它们,然后问开发人员……这很有趣:)