php - 如何在 PHP 中将 urlencoded 查询字符串解析为数组(不更改名称)

标签 php

我知道你在想什么。 “我可以这么快回答这个问题!是 parse_str 函数!”但我为您准备了一些小窍门。

您会看到,PHP 将所有查询数据的名称转换为有效的 PHP 变量名称。什么?即使它们没有被存储为变量?在哪里记录?它不是。

$payload = 'data.name=value&data.other=value2';
parse_str($payload, $values);
var_export($values);
// Outputs:  array('data_name' => 'value', 'data_other' => 'value2')
// Expected: array('data.name' => 'value', 'data.other' => 'value2')

如何在不发生这种情况的情况下解析查询字符串?

最佳答案

您可以通过自己解析查询字符串来避免 PHP 对参数名称进行重命名。在 &= 字符上拆分字符串,然后是 urldecode()每个部分:

<?php

  $payload = 'data.name=value&data.other=value2';

  $values = array();

  $nv_strings = explode ('&', $payload);
  foreach ($nv_strings as $s) {
    $nv = explode ('=', $s, 2);
    $name = urldecode ($nv[0]);
    $value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
    $values[$name] = $value;
  }

  print_r ($values);

//  Array
//  (
//      [data.name] => value
//      [data.other] => value2
//  )

如果您的查询字符串包含重复键,上述代码将覆盖之前的键。这也可以解决:

<?php

  $payload = 'key=val1&key=val2&key=val3';

  $values = array();

  $nv_strings = explode ('&', $payload);
  foreach ($nv_strings as $s) {
    $nv = explode ('=', $s, 2);
    $name = urldecode ($nv[0]);
    $value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
    $values[] = array ($name => $value);
  }

  print_r ($values);

//  Array
//  (
//      [0] => Array ([key] => val1)
//      [1] => Array ([key] => val2)
//      [2] => Array ([key] => val3)
//  )

您可能希望将重复键合并到子数组中:

<?php

  $payload = 'key1=val1&key1=val2&key2=val3';

  $values = array();

  $nv_strings = explode ('&', $payload);
  foreach ($nv_strings as $s) {
    $nv = explode ('=', $s, 2);
    $name = urldecode ($nv[0]);
    $value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
    if (isset ($values[$name])) {
      if (is_array ($values[$name])) {
        $values[$name][] = $value;
      } else {
        $values[$name] = array ($values[$name], $value);
      }
    } else {
      $values[$name] = $value;
    }
  }

  print_r ($values);

//  Array
//  (
//      [key1] => Array ([0] => val1
//                       [1] => val2)
//      [key2] => val3
//  )

您可以通过始终使用子数组来稍微简化代码:

<?php

  $payload = 'key1=val1&key1=val2&key2=val3';

  $values = array();

  $nv_strings = explode ('&', $payload);
  foreach ($nv_strings as $s) {
    $nv = explode ('=', $s, 2);
    $name = urldecode ($nv[0]);
    $value = (isset ($nv[1]) ? urldecode ($nv[1]) : null);
    if (isset ($values[$name])) {
      $values[$name][] = $value;
    } else {
      $values[$name] = array ($value);
    }
  }

  print_r ($values);

//  Array
//  (
//      [key1] => Array ([0] => val1
//                       [1] => val2)
//      [key2] => Array ([0] => val3)
//  )

关于php - 如何在 PHP 中将 urlencoded 查询字符串解析为数组(不更改名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27139048/

相关文章:

php - 如何在 HTTP 服务中进行身份验证?

php - HTML 下拉菜单的替代方案

php - 如何将 Angular 与 Symfony 集成

php - SoundCloud Api - 无法获取特定用户的所有收藏夹

php - 允许用户将 "Tab-delimited"数据粘贴到文本区域中

javascript - 在一个div上打开不同的php文件

php - Doctrine 选择多个对象

php - PHP 中是否有内置方法可以从多维数组中获取数组?

java - PHP exec() 无法访问 .jar 文件

php - 插入行后如何从 MySQL 表返回值?