gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:08:40 25 4
gpt4 key购买 nike

我知道你在想什么。 “我可以这么快回答这个问题!是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com