PHP Получить ключи из строки запроса, для каждого ключа: создать URL, удалив этот ключ из строки запроса - PullRequest
1 голос
/ 23 декабря 2011

Обновление:

Спасибо Хакре и Мартино за ответы: теперь функция работает намного лучше:

$queryString = $_SERVER['QUERY_STRING']; 
parse_str($queryString, $params);

    foreach ($params as $key => $term)
    {
        $tags = explode(' ',$term);
        $tagCount = count($tags);

        //If there is more than one term per key, break them up
        if($tagCount > 1) {
            foreach($tags as $tag) {
                if($term != '') {
                    //remove individual term from query string and remove any redundant characters
                    $urlx = str_replace($tag, '', $queryString);
                    $urlx = str_replace(array('=+', '++', '+&'), array('=', '+', '&'), $urlx);
                    if(substr($urlx, -1) == '+'){
                     $urlx = substr($urlx,0,-1);
                    }
                    echo '<a href="?'.$urlx.'">'.$tag.'</a><br/>';
                }
            }
        } else {
            //If there's just one term per key get rid of the key/term pair
            $these = array_diff_assoc($params, array($key => $term));
            printf("<a href=\"?%s\">%s</a><br>\n", http_build_query($these), $term);    
        }
    }

Если у кого-нибудь есть какие-либо дополнительные предложения по улучшению этого фрагмента, я буду очень признателен!

Спасибо


оригинальный вопрос

Я пытаюсь создать функцию, которая позволяет пользователю "X out" или очистить от заданного фильтра поиска. Я написал функцию (очень взломанным способом), которая получает ключи от каждой переменной GET и затем создает URL, который удалит этот ключ из строки поиска.

У кого-нибудь есть лучший или более элегантный способ написать это?

Спасибо

 <?php
    $queryString = $_SERVER['QUERY_STRING']; 
    $getArray = explode("=", $queryString); 

    foreach($getArray as $get) {
        $tagArray = explode("+",$get);
        foreach($tagArray as $tag){
            $pos = strpos($tag,'=');
            if($pos === false) {
                $urlx = str_replace($tag, '', $queryString);
                $urlx = str_replace('=+','=',$urlx);
                $urlx = str_replace('++','+',$urlx);
                $urlx = str_replace('+&','&',$urlx);
                echo '<a href="?'.$urlx.'">'.$tag.'</a><br/>';
            }
            else {
                $term = explode('=',$tag);
                $urlx = str_replace($term[1], '', $queryString);
                $urlx = str_replace('=+','=',$urlx);
                $urlx = str_replace('++','+',$urlx);
                $urlx = str_replace('+&','&',$urlx);
                echo '<a href="?'.$urlx.'">'.$term[1].'</a><br/>';
            }
        }
    }
    ?>

Пример вывода будет следующим:

Строка запроса: ?style=automotive&type=commercial+residential

Вывод HTML:

<a href="?type=commercial+residential">automotive</a><br/>
<a href="?style=automotive&type=residential">commercial</a><br/>
<a href="?style=automotive&type=commercial">residential</a><br/>

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

PHP имеет встроенные функции для решения вашей проблемы, одну для анализа строки запроса и одну для повторной компиляции: parse_str и http_build_query:

parse_str($queryString, $params);

foreach ($params as $key => $term)
{
    $these = array_diff_assoc($params, array($key => $term));
    printf("<a href=\"?%s\">%s</a><br>\n", http_build_query($these), $term);
}

Пример вывода:

<a href="?b=b&c=c">a</a><br>
<a href="?a=a&c=c">b</a><br>
<a href="?a=a&b=b">c</a><br>

Демо

1 голос
/ 23 декабря 2011

Одна вещь, которую вы могли бы сделать наверняка, это использовать массивы, принимающие функцию str_replace:

$urlx = str_replace('=+','=',$urlx);
$urlx = str_replace('++','+',$urlx);
$urlx = str_replace('+&','&',$urlx);

становится

$urlx = str_replace(array('=+', '++', '+&'), array('=', '+', '&'), $urlx);

То же самое для else части

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...