Php 从数组中删除关联的键/值对(嵌套)
我有两个函数可以向查询字符串添加remove参数。“add_query_params”(感谢这个论坛)工作得很好,我现在可以向同一类型的查询字符串添加多个标记 比如说Php 从数组中删除关联的键/值对(嵌套),php,arrays,laravel,nested,Php,Arrays,Laravel,Nested,我有两个函数可以向查询字符串添加remove参数。“add_query_params”(感谢这个论坛)工作得很好,我现在可以向同一类型的查询字符串添加多个标记 比如说 http://example.com?tags[]=flowers&tags[]=shrubs&category[]=garden 如您所见,我可以添加多个相同的参数,我还可以使用QueryFilter很好地查询这些参数 然而,我的最新问题是,只删除一个标记类型,而不影响查询字符串的其余部分。然后,我将在不使用已
http://example.com?tags[]=flowers&tags[]=shrubs&category[]=garden
如您所见,我可以添加多个相同的参数,我还可以使用QueryFilter很好地查询这些参数
然而,我的最新问题是,只删除一个标记类型,而不影响查询字符串的其余部分。然后,我将在不使用已删除标记的情况下重建查询
昨天有人善意地帮我指出了一点,但这会删除所有标记键值,而不仅仅是指定的标记
因此,如果我要从上面的URL中删除say$tags[]bushs
,它实际上会同时删除tag[]bushs和$tags[]flowers
对于我正在设计的过滤系统来说,这显然不是很直观。我想知道的是如何只删除单个键值对,而保留其他键值对不变
这是我的助手函数
//Accept a param array which passthrough through tag type eg category/tag and value
function remove_query_params(array $params = [])
{
//Set to array
$existingParams = [];
$existingParams = request()->query();
foreach($params as $key=>$value){
if (isset($existingParams[$value])) {
unset($existingParams[$value]);
}
}
$query = http_build_query($existingParams);
return url()->current() . '?' . $query;
}
//Need to return: user removes tag from filter in blade, URL recontructs without the passed through tag value
//Before
//http://example.com?tags[]=flowers&tags[]=shrubs&category[]=garden
//After
//http://example.com?tags[]=flowers&category[]=garden
这不起作用,如果我将$value更改为$key,那么它会,但它会删除相同类型的所有键,而不是我想要的行为
我通过在blade模板中调用激活此行为,这将形成a href
//Pass through parameter type and parameter value
{{remove_query_params(['category' => $category->id]) }}
有人知道我下一步要去哪里吗#
谢谢,祝我好运,我就在不远处:)
Adam我希望此解决方案能帮助您:
<?php
function remove_query_params(array $params = [])
{
//Set to array
$existingParams = [
'tags' => [
'aaaa',
'bbbb'
],
'category' => 'ccc'
];
// go trough all parameters
foreach ($existingParams as $key1 => $value1) {
// go to the parameters, which need to be deleted
foreach ($params as $key2 => $value2) {
// only if the keys equals, do something
if ($key1 === $key2) {
// if the param is an array
if (is_array($value1)) {
foreach ($value1 as $k => $v) {
// if the elements to delete are an array
if (is_array($value2)) {
foreach ($value2 as $b => $r) {
if ($v == $r) {
unset($existingParams[$key1][$k]);
}
}
} else {
if ($v == $value2) {
unset($existingParams[$key1][$k]);
}
}
}
} else {
if (isset($existingParams[$key2])) {
unset($existingParams[$key2]);
}
}
}
}
}
$query = http_build_query($existingParams);
return $query;
}
echo remove_query_params(['tags' => 'aaaa']);
echo "\n";
echo remove_query_params(['tags' => ['aaaa', 'bbbb']]);
echo "\n";
echo remove_query_params(['category' => 'ccc']);
echo "\n";
我希望此解决方案能帮助您:
<?php
function remove_query_params(array $params = [])
{
//Set to array
$existingParams = [
'tags' => [
'aaaa',
'bbbb'
],
'category' => 'ccc'
];
// go trough all parameters
foreach ($existingParams as $key1 => $value1) {
// go to the parameters, which need to be deleted
foreach ($params as $key2 => $value2) {
// only if the keys equals, do something
if ($key1 === $key2) {
// if the param is an array
if (is_array($value1)) {
foreach ($value1 as $k => $v) {
// if the elements to delete are an array
if (is_array($value2)) {
foreach ($value2 as $b => $r) {
if ($v == $r) {
unset($existingParams[$key1][$k]);
}
}
} else {
if ($v == $value2) {
unset($existingParams[$key1][$k]);
}
}
}
} else {
if (isset($existingParams[$key2])) {
unset($existingParams[$key2]);
}
}
}
}
}
$query = http_build_query($existingParams);
return $query;
}
echo remove_query_params(['tags' => 'aaaa']);
echo "\n";
echo remove_query_params(['tags' => ['aaaa', 'bbbb']]);
echo "\n";
echo remove_query_params(['category' => 'ccc']);
echo "\n";
标记
不是关联的数组。这只是一个字符串列表。另外,查看$existingParams=request()->query()的值代码>它不是标记
数组。它是一个包含它的对象。这就是为什么当您使用$key
时,它会工作,但会删除所有内容,因为$key
是标记。因此,在您的检查中,$existingParams['tags']
应检查值<在本例中,您要查看的是数组中的code>。标记
不是关联数组。这只是一个字符串列表。另外,查看$existingParams=request()->query()的值代码>它不是标记
数组。它是一个包含它的对象。这就是为什么当您使用$key
时,它会工作,但会删除所有内容,因为$key
是标记。因此,在您的检查中,$existingParams['tags']
应检查值<代码>在数组中
就是您在本例中所看到的。希望这能解决您的问题。我刚刚提供了核心函数,以某种方式完成任务
$query = "tags[]=flowers&tags[]=shrubs&category[]=garden";
echo (remove_query_params( [ 'tags' => 'shrubs' ], $query ));
function remove_query_params(array $params = [], $query )
{
parse_str( $query, $existingParams );
$existing_keys = array_keys( $existingParams);
foreach($params as $key=>$value){
if( in_array( $key, $existing_keys ) ){
foreach ($existingParams[$key] as $param_key => $param_value) {
if( $param_value == $value ){
unset( $existingParams[$key][$param_key] );
}
}
}
}
$query = http_build_query($existingParams);
return $query;
}
希望这能解决您的问题。我只是提供了核心功能,以某种方式完成任务
$query = "tags[]=flowers&tags[]=shrubs&category[]=garden";
echo (remove_query_params( [ 'tags' => 'shrubs' ], $query ));
function remove_query_params(array $params = [], $query )
{
parse_str( $query, $existingParams );
$existing_keys = array_keys( $existingParams);
foreach($params as $key=>$value){
if( in_array( $key, $existing_keys ) ){
foreach ($existingParams[$key] as $param_key => $param_value) {
if( $param_value == $value ){
unset( $existingParams[$key][$param_key] );
}
}
}
}
$query = http_build_query($existingParams);
return $query;
}