从查询字符串中添加、更改和删除 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));
}

这只会处理简单的查询字符串。如果有任何嵌套元素,您将需要一个递归解决方案。但对于这些答案中的任何一个以及您的原始函数都是如此。