从查询字符串中添加,更改和删除GET参数

时间:2019-08-15 20:19:16

标签: php function get query-string

假设当前的查询字符串如下

ViewGroup toolbar;
int remaining_width = max_width;
for item in items:
    view = inflate(item);
    view.measure()
    remaining_width -= view.getMeasuredWidth();
    if (remaining_width < 0) {
         break;
     } 
     toolbar.addView(view);        
}

我需要一个可以在查询字符串中添加和删除几个参数的函数。例如:

$_SERVER['QUERY_STRING']:
apple=green&banana=yellow2&navi=blue&clouds=white&car=black

应该给予

echo ChangeQueryString('eyes=2&fingers=10&car=purple', 'clouds&apple');

因此,该函数不仅应该能够添加新参数(eyes = 2&fingers = 10),而且还应该更改已经存在的参数(car = black => car = purple)。

所有这些新的和更改的参数都可以在函数的第一个参数中传递。用“&”分隔。

该函数的第二个参数应该传递参数的所有键,如果有的话,这些键应从查询字符串中删除。

我只管理可以添加和替换参数的第一部分。但是也许有人有一种更有效的方法,包括用于从查询字符串中删除内容的第二个参数。

实际上,最后我需要完整的当前URL。这就是为什么我添加了PHP_SELF。虽然还没有拆卸部分...

banana=yellow2&navi=blue&car=purple&eyes=2&fingers=10

5 个答案:

答案 0 :(得分:3)

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()

答案 1 :(得分:1)

正如第一条评论所述,如果您使用$_GET全局数组,那么您只是在使用 array 进行操作,可以在其中添加,删除和操作任何时尚。

<?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)将数组变回字符串。

答案 2 :(得分:1)

将查询字符串解析为数组后,可以合并和比较它们以产生所需的结果。

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));
}

这只会处理简单的查询字符串。如果有任何嵌套元素,则需要递归解决方案。但这对于任何这些答案以及您的原始功能都是正确的。

答案 3 :(得分:0)

您不应更改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));
}

答案 4 :(得分:-2)

由于有2个不同的分隔符,因此使其更简单。我们可以做的是先将字符串用“&”分割,然后将部分用“ =”分割,这样它实际上是键/值对的二维数组或一维数组。 (在C#中,如果可以帮助您这样思考,则可以将其插入Dictionary中。否则请忽略我刚才所说的内容。)

这需要同时在现有查询字符串和ChangeQueryString方法的第一个参数上完成。由于您在第二个参数中只有一个键,因此可以在“&”上进行分割。

我将遍历查询数组以查找替换数组中键的存在,然后基于该键进行更新。然后,我将向后循环遍历查询数组,以在删除数组中查找键,然后从查询数组中删除这些实例。

由于第二个循环必须倒退以防止索引出现问题,因此不能同时执行两个循环。如果您尝试这种方法,或者甚至尝试进行第二种操作,则需要更多代码,并且很快就会陷入困境。我建议最后执行删除操作,因为您显然希望保持现有键的顺序,并且这样做只会对性能造成最小的影响。此性能意见假定您没有使用成千上万个(或更多)这些参数,并且坚持使用URL / URI中的Web标准化允许字符数量。

如果您决定使用提到的rickdenhaan之类的$GET数组,则不必解码查询字符串。其余的仍然适用。

当然,有许多不同的方法可以编写此代码,以及与我描述的方法不同的方法来执行所需的操作。我只是在描述我要做什么。如果其他人有其他意见,我建议您发布自己的答案,而不要对此答案投反对票或批评。

由于这似乎是一个家庭作业问题,因此我不会为OP编写代码。如果这不是家庭作业的问题,我认为他们应该能够从我已经提供的内容中自己解决这个问题。

希望我一直很有帮助,祝你好运!