簡體   English   中英

從數組中刪除關聯的鍵/值對(嵌套)

[英]Removing an associated key/value pair from array (nested)

我有兩個函數可以將刪除參數添加到查詢字符串中。 “add_query_params”(感謝本論壇)運行良好,我現在可以向相同類型的查詢字符串添加多個標簽。

例如

http://example.com?tags[]=flowers&tags[]=shrubs&category[]=garden

如您所見,我可以添加多個相同的參數,我也使用查詢過濾器很好地查詢這些參數。

然而,我最新的問題是簡單地刪除單個標簽類型而不影響查詢字符串的其余部分。 然后我將在沒有刪除標簽的情況下重建查詢。

昨天有人好心地幫助了我,但這會刪除所有標簽鍵值,而不僅僅是指定的標簽。

因此,如果我要從上述 URL 中刪除 say $tags[]shrubs ,它實際上會同時刪除tag[]shrubs AND $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 那么它會起作用,但它會刪除相同類型的所有鍵,而不是我想要的行為。

我通過刀片模板中的調用激活此行為,這形成了一個 href

//Pass through parameter type and parameter value
{{remove_query_params(['category' => $category->id]) }}

有沒有人知道我下一步要去哪里?#

謝謝和手指交叉我不遠了:)

亞當

我希望這個解決方案能幫助你:

<?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";

tags不是關聯的數組。 它只是一個字符串列表。 另外,看看$existingParams = request()->query(); 它不是tags數組。 它是一個包含它的對象。 這就是為什么當您使用$key它可以工作但會刪除所有內容,因為$keytags 因此,在您的支票$existingParams['tags']應檢查shrubs值。 in_array就是您在這種情況下要查找的內容。

希望這能解決你的問題。我只是提供了核心功能來以某種方式完成工作

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM