当字符串包含 PHP 中的重复键时,如何将字符串转换为关联数组? [复制]

Posted

技术标签:

【中文标题】当字符串包含 PHP 中的重复键时,如何将字符串转换为关联数组? [复制]【英文标题】:How do I convert a string to an associative array when the string contains a duplicate key in PHP? [duplicate] 【发布时间】:2021-11-23 09:06:21 【问题描述】:

由于我们的应用程序的构建方式,有时在 URL 查询中会出现重复的键,例如这两个 m 键: foo=bar&foz=baz&fom=bam&m=q50&m=350Z

然后它们被用来在 JS 中做一些事情。

我需要从这个字符串构建一个关联数组并保留m 的第一个值,但是我尝试过的任何标准数组函数最终都会在到达第二个时覆盖m,例如:

$n = preg_match_all('/(\w+)=([^&$]*)/', $_SERVER['QUERY_STRING'], $matches);
   
for($i=0; $i<$n; $i++)

    $params[$matches[1][$i]] = $matches[2][$i];

echo var_dump($params);

结果

array (size=4)
  'foo' => string 'bar' (length=3)
  'foz' => string 'baz' (length=3)
  'fom' => string 'bam' (length=3)
  'm' => string '350Z' (length=4)

有没有人知道如何保留所有其他键/值对但保留第一个 m

需要注意的是m不会总是出现在字符串的末尾,所以在我设置了第一个m之后,我不能break跳出循环。

【问题讨论】:

这是一个 XY 问题。不要试图破解格式不合适的查询字符串的解决方案。相反,请修复查询字符串,这样您就不需要破解解决方案。 我不拥有形成查询字符串的进程。 【参考方案1】:

在添加之前检查数组中是否已经存在带有键的元素。

    for($i=0; $i<$n; $i++)
    
        if (!isset($params[$matches[1][$i]])) 
            $params[$matches[1][$i]] = $matches[2][$i];
        
    
    var_dump($params);

【讨论】:

啊,当然!我用!empty($params[$matches[1]['m']]) 尝试了一个版本,但没有效果,但我认为试图通过 ['m'] 访问它是问题所在。干得好@Barmar,谢谢。

以上是关于当字符串包含 PHP 中的重复键时,如何将字符串转换为关联数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

php如何从php中的字符串中删除最后一个字符[重复]

Hashmap:当我们放置相同的键时地图如何工作[重复]

php如何将json对象转字符串

如何从php中的sql查询中获取字符串[重复]

事件类型--键盘与文本事件

[转载]C#如何清除字符串数组中的重复项