假设当前的查询字符串如下
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
答案 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编写代码。如果这不是家庭作业的问题,我认为他们应该能够从我已经提供的内容中自己解决这个问题。
希望我一直很有帮助,祝你好运!