从查询字符串中添加、更改和删除 GET 参数
Add, change, and remove GET parameters from query string
假设当前查询字符串如下
$_SERVER['QUERY_STRING']:
apple=green&banana=yellow2&navi=blue&clouds=white&car=black
我需要一个可以在查询字符串中添加和删除多个参数的函数。例如:
echo ChangeQueryString('eyes=2&fingers=10&car=purple', 'clouds&apple');
应该给
banana=yellow2&navi=blue&car=purple&eyes=2&fingers=10
因此,函数不仅应该能够添加新参数 (eyes=2&fingers=10),而且还应该更改已经存在的参数 (car=black => car=purple)。
所有这些新的和更改的参数都可以在函数的第一个参数中传递。用“&”分隔。
该函数的第二个参数应传递应从查询字符串中删除的参数的所有键(如果存在)。
我只管理了可以添加和替换参数的第一部分。但也许有人有更有效的方法,包括从查询字符串中删除内容的第二个参数。
其实最后我需要完整的电流URL。这就是我添加 PHP_SELF 的原因。虽然删除部分还没有...
function ChangeQueryString ($add, $remove) {
if (empty($_SERVER['QUERY_STRING'])){
$final_url = $_SERVER['PHP_SELF']."?".$add;
} else {
$query_string_url_addition = $_SERVER['QUERY_STRING'].'&'.$add;
parse_str($query_string_url_addition, $query_array);
$final_url = $_SERVER['PHP_SELF']."?".http_build_query($query_array);
}
return $final_url;
}
由于有 2 个不同的分隔符,这使它更简单一些。我们可以做的是首先用“&”拆分字符串,然后用“=”拆分各个部分,这样它就是一个二维数组或一维数组,实际上是 key/value 对。 (在 C# 中,它可以插入到一个 Dictionary
中,如果它能帮助你这样想的话。否则请忽略我刚才说的。)
这需要对现有查询字符串和 ChangeQueryString
方法的第一个参数进行。由于你在第二个参数中只有一个键,你可以在“&”上拆分。
我将遍历查询数组以查找替换数组中是否存在键,并基于此进行更新。之后,我将通过查询数组向后循环查找删除数组中的键,并从查询数组中删除这些实例。
因为第二个循环必须向后执行以防止索引出现问题,所以您不能同时执行两个循环。如果你尝试这个,或者甚至尝试做第二个,你需要更多的代码,它很快就会变得复杂。我建议最后进行删除,因为您显然希望保留现有键的顺序,并且最后进行删除对性能的影响很小。此性能意见假设您没有执行这些参数中的数千个(或更多),并且在您的 URL/URI.
中坚持网络标准化允许的字符数量
如果您决定像 rickdenhaan 提到的那样使用 $GET
数组,您根本不需要解码查询字符串。其余的仍然适用。
当然,有许多不同的编码方法,以及与我描述的方法不同的方法来执行您想要的操作。我只是在描述我会做什么。如果其他人有其他意见,我建议您 post 您自己的答案,而不是对这个答案投反对票或批评性评论。
因为这看起来可能是一道家庭作业题,所以我不打算为 OP 编写代码。如果这不是作业问题,我认为他们应该能够根据我已经给出的内容自行解决这个问题。
希望我对您有所帮助,祝您好运!
正如第一条评论所指出的,如果您使用 $_GET
全局数组,那么您只是在使用 数组 ,您可以在其中添加,删除并以任何方式进行操作。
<?php
// Sample query string: ?apple=green&banana=yellow2&navi=blue&clouds=white&car=black
// You can either copy the query string to a new variable or work with the $_GET array directly.
// In this case, I am copying it to a new array to preserve the original.
$queryParams = $_GET;
// Get the value of clouds
$cloudColour = $queryParams ['clouds'];
// Change car from black to purple
$queryParams['car'] = 'purple';
// Change apple to red
$queryParams['apple'] = 'red';
// Remove banana
unset($queryParams['banana']);
// Add person=Mark
$queryParams['person'] = 'Mark';
最后,如您所知,您可以使用 http_build_query($queryParams)
将数组转回字符串。
function changeQueryString($queryStr, $updateStr, $removeStr) {
parse_str($queryStr, $queryArr);
parse_str($updateStr, $updateArr);
parse_str($removeStr, $removeArr);
$changedArr = array_merge($queryArr, $updateArr);
foreach($removeArr as $k => $v) {
if(array_key_exists($k, $changedArr)) {
unset($changedArr[$k]);
}
}
return http_build_query($changedArr);
}
$str = 'apple=green&banana=yellow2&navi=blue&clouds=white&car=black';
$changedQuery = changeQueryString($str, 'eyes=2&fingers=10&car=purple', 'clouds&apple');
var_dump($changedQuery);
这应该适合您,利用 parse_str()、array_merge() 和 http_build_query()
你不应该改变 PHP 魔法 GLOBALS。
使用数组比字符串更具可读性。所以试试这个可能适合您需要的修改。
$queryString = 'apple=green&banana=yellow2&navi=blue&clouds=white&car=black';
echo changeQueryString($queryString, ['eyes' => 2, 'fingers' => 10], ['clouds', 'apple']);
function changeQueryString(string $queryString, array $add, array $remove): string
{
$queryValues = [];
parse_str($queryString ?? '', $queryValues);
foreach ($remove as $key) {
if (isset($queryValues[$key])) unset($queryValues[$key]);
}
return http_build_query(array_merge($queryValues, $add));
}
将查询字符串解析为数组后,您可以合并和比较它们以生成所需的结果。
function ChangeQueryString($original, $add, $remove) {
$new = [];
parse_str($original, $new[0]);
parse_str($add, $new[1]);
parse_str($remove, $delete);
return http_build_query(array_diff_key(array_merge(...$new), $delete));
}
这只会处理简单的查询字符串。如果有任何嵌套元素,您将需要一个递归解决方案。但对于这些答案中的任何一个以及您的原始函数都是如此。
假设当前查询字符串如下
$_SERVER['QUERY_STRING']:
apple=green&banana=yellow2&navi=blue&clouds=white&car=black
我需要一个可以在查询字符串中添加和删除多个参数的函数。例如:
echo ChangeQueryString('eyes=2&fingers=10&car=purple', 'clouds&apple');
应该给
banana=yellow2&navi=blue&car=purple&eyes=2&fingers=10
因此,函数不仅应该能够添加新参数 (eyes=2&fingers=10),而且还应该更改已经存在的参数 (car=black => car=purple)。
所有这些新的和更改的参数都可以在函数的第一个参数中传递。用“&”分隔。
该函数的第二个参数应传递应从查询字符串中删除的参数的所有键(如果存在)。
我只管理了可以添加和替换参数的第一部分。但也许有人有更有效的方法,包括从查询字符串中删除内容的第二个参数。
其实最后我需要完整的电流URL。这就是我添加 PHP_SELF 的原因。虽然删除部分还没有...
function ChangeQueryString ($add, $remove) {
if (empty($_SERVER['QUERY_STRING'])){
$final_url = $_SERVER['PHP_SELF']."?".$add;
} else {
$query_string_url_addition = $_SERVER['QUERY_STRING'].'&'.$add;
parse_str($query_string_url_addition, $query_array);
$final_url = $_SERVER['PHP_SELF']."?".http_build_query($query_array);
}
return $final_url;
}
由于有 2 个不同的分隔符,这使它更简单一些。我们可以做的是首先用“&”拆分字符串,然后用“=”拆分各个部分,这样它就是一个二维数组或一维数组,实际上是 key/value 对。 (在 C# 中,它可以插入到一个 Dictionary
中,如果它能帮助你这样想的话。否则请忽略我刚才说的。)
这需要对现有查询字符串和 ChangeQueryString
方法的第一个参数进行。由于你在第二个参数中只有一个键,你可以在“&”上拆分。
我将遍历查询数组以查找替换数组中是否存在键,并基于此进行更新。之后,我将通过查询数组向后循环查找删除数组中的键,并从查询数组中删除这些实例。
因为第二个循环必须向后执行以防止索引出现问题,所以您不能同时执行两个循环。如果你尝试这个,或者甚至尝试做第二个,你需要更多的代码,它很快就会变得复杂。我建议最后进行删除,因为您显然希望保留现有键的顺序,并且最后进行删除对性能的影响很小。此性能意见假设您没有执行这些参数中的数千个(或更多),并且在您的 URL/URI.
中坚持网络标准化允许的字符数量如果您决定像 rickdenhaan 提到的那样使用 $GET
数组,您根本不需要解码查询字符串。其余的仍然适用。
当然,有许多不同的编码方法,以及与我描述的方法不同的方法来执行您想要的操作。我只是在描述我会做什么。如果其他人有其他意见,我建议您 post 您自己的答案,而不是对这个答案投反对票或批评性评论。
因为这看起来可能是一道家庭作业题,所以我不打算为 OP 编写代码。如果这不是作业问题,我认为他们应该能够根据我已经给出的内容自行解决这个问题。
希望我对您有所帮助,祝您好运!
正如第一条评论所指出的,如果您使用 $_GET
全局数组,那么您只是在使用 数组 ,您可以在其中添加,删除并以任何方式进行操作。
<?php
// Sample query string: ?apple=green&banana=yellow2&navi=blue&clouds=white&car=black
// You can either copy the query string to a new variable or work with the $_GET array directly.
// In this case, I am copying it to a new array to preserve the original.
$queryParams = $_GET;
// Get the value of clouds
$cloudColour = $queryParams ['clouds'];
// Change car from black to purple
$queryParams['car'] = 'purple';
// Change apple to red
$queryParams['apple'] = 'red';
// Remove banana
unset($queryParams['banana']);
// Add person=Mark
$queryParams['person'] = 'Mark';
最后,如您所知,您可以使用 http_build_query($queryParams)
将数组转回字符串。
function changeQueryString($queryStr, $updateStr, $removeStr) {
parse_str($queryStr, $queryArr);
parse_str($updateStr, $updateArr);
parse_str($removeStr, $removeArr);
$changedArr = array_merge($queryArr, $updateArr);
foreach($removeArr as $k => $v) {
if(array_key_exists($k, $changedArr)) {
unset($changedArr[$k]);
}
}
return http_build_query($changedArr);
}
$str = 'apple=green&banana=yellow2&navi=blue&clouds=white&car=black';
$changedQuery = changeQueryString($str, 'eyes=2&fingers=10&car=purple', 'clouds&apple');
var_dump($changedQuery);
这应该适合您,利用 parse_str()、array_merge() 和 http_build_query()
你不应该改变 PHP 魔法 GLOBALS。
使用数组比字符串更具可读性。所以试试这个可能适合您需要的修改。
$queryString = 'apple=green&banana=yellow2&navi=blue&clouds=white&car=black';
echo changeQueryString($queryString, ['eyes' => 2, 'fingers' => 10], ['clouds', 'apple']);
function changeQueryString(string $queryString, array $add, array $remove): string
{
$queryValues = [];
parse_str($queryString ?? '', $queryValues);
foreach ($remove as $key) {
if (isset($queryValues[$key])) unset($queryValues[$key]);
}
return http_build_query(array_merge($queryValues, $add));
}
将查询字符串解析为数组后,您可以合并和比较它们以生成所需的结果。
function ChangeQueryString($original, $add, $remove) {
$new = [];
parse_str($original, $new[0]);
parse_str($add, $new[1]);
parse_str($remove, $delete);
return http_build_query(array_diff_key(array_merge(...$new), $delete));
}
这只会处理简单的查询字符串。如果有任何嵌套元素,您将需要一个递归解决方案。但对于这些答案中的任何一个以及您的原始函数都是如此。