Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Работа с URL
Фибер Оптик  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 85
Пользователь №: 16771
На форуме: 7 лет, 10 месяцев, 6 дней
Карма:




Здравствуйте.
У меня возник вопрос на счёт формирования URL.
Ситуация:
Имееется URL с GET-параментрами типа /listProduct/list/?brand[]=1&brand[]=2.
Формирую я этот URL функцией

function ggp($url) {
preg_match('/^(.+?)(\?.*?)?(#.*)?$/', $url, $matches);
$gp = (isset($matches[2])) ? $matches[2] : '';
return $gp;
}


Имеются ссылки:


<a href="<?=ggp ($_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']).$getParam?>brand[]=1">Бренд 1</a>
<
a href="<?=ggp ($_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']).$getParam?>brand[]=2">Бренд 2</a>
<
a href="<?=ggp ($_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']).$getParam?>brand[]=3">Бренд 3</a>


Параметр $getParam это ничто иное как либо "?", либо "&", которые я формирую так:


$parse_url = parse_url($_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
$getParam = isset ($parse_url['query']) ? '&' : '?';


Вопрос заключается в следующем:
Как мне из этого адреса удалить повторные параметры, например, если у меня будет такая строка /listProduct/list/?brand[]=1&brand[]=2&brand[]=2, то мне надо чтоб все одинаковые параметры были удалены, т.е остаться должно /listProduct/list/?brand[]=1.

Я делаю фильтр по товарам. В URL будет ещё входить другие параметры.

Может я всё как-то тяжело делаю? Возможно ли оптимизировать как-то уже сделанное?

Заранее благодарю за помощь.

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 8 дней
Карма: 184




Фибер Оптик, неправильный подход. Зачем вообще пытаться парсить REQUEST_URI, если все переданные параметры есть в $_GET?
Пример, как можно сделать:
function toggleFilterParameterValue($params, $name, $value) {
if (!array_key_exists($name, $params)) {
$params[$name] = [$value];
} else {
if (false !== ($key = array_search($value, $params[$name]))) {
unset($params[$name][$key]);
} else {
$params[$name][] = $value;
}
}

return $params;
}

Пользоваться так:
<a href="http://mysite.com?<?=http_build_query(toggleFilterParameterValue($_GET, 'brand', 1))?>">Brand 1</a>
<a
href="http://mysite.com?<?=http_build_query(toggleFilterParameterValue($_GET, 'brand', 2))?>">Brand 2</a>
<a
href="http://mysite.com?<?=http_build_query(toggleFilterParameterValue($_GET, 'brand', 3))?>">Brand 3</a>
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Фибер Оптик  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 85
Пользователь №: 16771
На форуме: 7 лет, 10 месяцев, 6 дней
Карма:




Спасибо за ответ, kaww, но у меня не получается использовать данную функцию, т.к в .htaccess у меня прописано следующее правило для ЧПУ:

RewriteRule ^listProduct/(.*)/$ ?view=listProduct&alias=$1 [QSA,L]


и, видимо в связи с этим у меня получается следующая ссылка:
http://mysite.ru/listProduct/kompressori-porshnevie/?view=listProduct&alias=kompressori-porshnevie&am p;brand=1


Т.е ЧПУ теряется.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 8 дней
Карма: 184




Цитата (Фибер Оптик @ 15.01.2016 - 09:11)
Т.е ЧПУ теряется.

Ну тогда просто не теряй его ;)
Приведенная мною функция возвращает массив, который потом можешь куда угодно подставить, и на ее работу RewriteRule никак не влияет:
$params = ['brand' => [1,2], 'foo' => ['bar', 'baz']];

var_dump(
toggleFilterParameterValue($params, 'brand', 1),
toggleFilterParameterValue($params, 'brand', 2),
toggleFilterParameterValue($params, 'brand', 3)
);
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 7 лет, 11 месяцев, 24 дня
Карма: 58




kaww что то ты сильно замудрил, можно было проще сделать:


function toggleFilterParameterValue($get, $name, $value) {
$get[$name] = array_diff($get[$name], [$value]);
$get[$name][] = $value;
return $get;
}
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 8 дней
Карма: 184




TMake, может и за мудрил, но твой вариант работает неправильно, конечно, при условии, что я правильно понял суть задачи стоящей перед ТСом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
xlebosol  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Знатный быдлокодер
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 337
Пользователь №: 32761
На форуме: 4 года, 5 месяцев, 21 день
Карма: 19




Что это за три матерных слова - ggp. Скажите ссылка
/listProduct/list/?brand[]=1&brand[]=2
занимает первые позиции в выдаче поисковика? Что мешало или мешает создавать проект на прокаченных CMS или фреймворках?
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Фибер Оптик  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 85
Пользователь №: 16771
На форуме: 7 лет, 10 месяцев, 6 дней
Карма:




Друзья, разрешите мне ещё раз рассказать про задачу, которая передомой стоит:
есть страница http://www.site.ru/listProduct/kompressori-porshnevie/, на которой будет выводится товар данной категории.
На этой странице должен быть фильтр, содержащий выбор из 3 брендов и ещё некоторые параметры типа цены, объёма и т.п.

Так вот изначально выдаётся весь товар. При клике на какой-то бренд из базы будут вытягиваться товары именно этого бренда, при клике на другой - к товарам первого бренда будут прибавляться товары второго и т.д.

Если первый бренд уже выбран, то повторный клик по этому бренду убирает товар этого бренда.

Это штуку проще было бы сделать формой, но хотят, чтоб это работало на ссылках.

Что касается высказывания уважаемого xlebosol, то попадаются такие люди, которые хотят сделать всё с нуля. smile.gif
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 8 дней
Карма: 184




Цитата (Фибер Оптик @ 15.01.2016 - 09:42)
Если первый бренд уже выбран, то повторный клик по этому бренду убирает товар этого бренда.

Именно эту задачу и решает приведенный мной код. Фибер Оптик, исключи из _GET
view и alias, и результат передавай в функцию:
$params = $_GET;
unset($params['view']);
unset($params['alias']);

<a href="http://mysite.ru/listProduct/kompressori-porshnevie/?<?=http_build_query(toggleFilterParameterValue($params, 'brand', 1))?>">Brand 1</a>
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 7 лет, 11 месяцев, 24 дня
Карма: 58




kaww что именно не правильно? добавь конкретики

Фибер Оптик тебе xlebosol не предлагает сделать все снуля, ты не верно трактуешь.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
xlebosol  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Знатный быдлокодер
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 337
Пользователь №: 32761
На форуме: 4 года, 5 месяцев, 21 день
Карма: 19




array_count_values($_GET['brand']) 

http://php.net/array_count_values
Получить функцией количество повторений.
Взять ключ или ключи, которые на данный момент значение того, что повторение > 1.
Удалить в GET все что надо.
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 8 дней
Карма: 184




Цитата (TMake @ 15.01.2016 - 10:11)
что именно не правильно? добавь конкретики

Достаточно запустить, чтобы понять.

$params = ['brand' => [1,2], 'foo' => ['bar', 'baz']];
print_r(toggleFilterParameterValue($params, 'brand', 1));


вернет
Array
(
[brand] => Array
(
[1] => 2
[2] => 1
)

[foo] => Array
(
[0] => bar
[1] => baz
)

)

а должно быть:
Array
(
[brand] => Array
(
[1] => 2
)

[foo] => Array
(
[0] => bar
[1] => baz
)

)


PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Фибер Оптик  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 85
Пользователь №: 16771
На форуме: 7 лет, 10 месяцев, 6 дней
Карма:




Спасибо всем большое за помощь. Я вроде начал вкуривать. :)

Единственное, что при первом клике по бренду все работает, get появляется, но дальше пропадают все бренды.
Код вёрстки выдаётся следующий:


<a href="?<!--error--><br />
<b>Warning</b>: array_search() expects parameter 2 to be array, string given in ......
<b>Fatal error</b>: Cannot unset string offsets in.......



PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
xlebosol  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Знатный быдлокодер
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 337
Пользователь №: 32761
На форуме: 4 года, 5 месяцев, 21 день
Карма: 19




$brands = $_GET['brand'];
$countDuplicates = array_count_values($brands);

$duplicates = array();
foreach($countDuplicates as $key => $duplicate){
if($duplicate > 1){
$duplicates[] = $key;
}
}


foreach($brands as $bKey => $brand){
if(in_array($brand, $duplicates)){
unset($brands[$bKey]);
}
}


var_dump($brands);
die;


Если я задачу правильно понял, найти и удалить все повторяющиеся значения, как указано в начале поста.
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 7 лет, 11 месяцев, 24 дня
Карма: 58




kaww ты суть не верно понял, там смысл был что бы в урле небыло дублей а не удалять то что выбрано, просмотри кэйс ТС.


xlebosol это если уже готовы параметры и их нужно поправить, так сказать зайти через задницу, в твоем случае ты лишний раз цыклом проходишь


function test($params, $name) {
$countList = array_count_values($params[$name]);
$diff = [];
foreach ($countList as $key => $count) {
if ($count > 1) {
$diff[] = $key;
}
}


$params[$name] = array_diff($params[$name], $diff);
return $params;
}

$params = [
'brand' => [1,2,2,3,4,4]
];

var_dump(test($params, 'brand'));

array(1) {
["brand"]=>
array(2) {
[0]=>
int(1)
[3]=>
int(3)
}
}
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса