Сохранение GET-данных+возможное их модифицирование

GeT

Новичок
Сохранение GET-данных+возможное их модифицирование

Вот, появилась необходимость сделать подобную вещь:
пользователь вводит вот такой адрес, например
"script.php?a=1&b=2&c=3" (1)

Внутри script.php мне нужно некоторые ссылки, чтобы в них тоже указывались эти параметры (а кое-где у этих параметров заменить значения).
Скажем, ссылка (1) в результате должна превратиться в "script2.php?a=1&c=4&e=4" (2)
Вручную чаще всего прописывать все ссылки неудобно, поэтому я сделал вот такую функцию:
PHP:
function modify_link($script,$up_vars) {
	global $allowed_links;
	if (!array_key_exists($script,$allowed_links))
	return $script;
	$link = $script;
	$vars = array();
	if ($_GET)
	foreach ($_GET as $c_var=>$c_val) {
		if (in_array($c_var,$allowed_links[$script])) {
			if (array_key_exists($c_var,$up_vars)) {
				if ($up_vars[$c_var] !== 0) $vars[]=$c_var."=".$up_vars[$c_var];
			}
			else $vars[]=$c_var."=".$c_val;
		}
	}
	if ($vars) {
		$link.="?".implode("&",$vars);
		$sep = "&";
	}
	else $sep="?";

	$t_vars = array();
	if ($up_vars)
	foreach ($up_vars as $v_name=>$v_val)
	if ($v_val !== 0) $t_vars[] = $v_name."=".$v_val;

	if ($t_vars) $link .= $sep.implode("&",$t_vars);


	return $link;
}

Тогда внутри скрипта скрипта script.php чтобы получить (2) надо вызвать функцию вот таким образом:
PHP:
$new_link = modify_link("script2.php",array("b"=>0, "c"=>4, "e"=>4)
Вопрос. Насколько разумно применение такой функции?
P.S. $_SESSION не предлагать
 

Фанат

oncle terrible
Команда форума
разумно, только она кажется мне слишком громоздкой
 

GeT

Новичок
Фанат
Да, сначала она была проще.
Но потом потребовалось, чтобы отсеивались "запрещенные" параметры и чтобы можно было модифицировать сразу несколько параметров.

А как можно проще?
 

Фанат

oncle terrible
Команда форума
мне кажется, запрещать нафиг не нужно. но дело хозяйское.
я не знаю, как можно проще. я не знаю, что делает твой скрипт, и зачем.
 

GeT

Новичок
1. Достаем все переменные из $_GET. Цикл для каждой переменной. Если она присутствует в массиве модифицируемых и ее новое значение не равно 0, то элементу массива $vars присваиваем
"имя_переменной=новое_значение. Иначе, $vars присваиваем "имя_переменной=старое_значение".
2. Если в $vars есть элементы, склеиваем массив $vars знаками "&" и добавляем спереди "?". Иначе, переменной $sep присваивем значение "?" (чтобы потом добавить в начало новый ссылки).
3. Если массив модифицируемых значений не пуст, для каждого элемента выполняем: если значение не равно нулю, добавляем в массив $t_vars элемент "имя_переменной=новое_значение".
4. Склеиваем $t_vars и добавляем спереди $sep.

Вот и все =))) Ух, задолбался писать
 

Фанат

oncle terrible
Команда форума
не знаю.
а чё бы не сделать просто два цикла?
первый пробегает по разрешённым и формирует новый массив беря значения из гета.
второй устанавливает в этом массиве значения, переданные в параметрах.
а дальше формируем строку.
 

GeT

Новичок
Фанат
Кроме значений из $_GET'а есть значения из массива, переданного как параметр функции. Их, если они ненулевые, тоже надо добавить в запрос. Там тоже цикл надо.
 

GeT

Новичок
Фанат
А, туплю.
Щас попробую упростить.

-~{}~ 26.04.05 21:36:

Кароче, как ты описал не получилось.
Сделал вот такое:
PHP:
function modify_link($script,$up_vars) {
	global $stored_links;
	if (!array_key_exists($script,$stored_links)) return $script;
	$link = $script;
	$vars = array();

	foreach ($stored_links[$script] as $c_var) {
		if($up_vars[$c_var] !== 0) {
			if (array_key_exists($c_var,$up_vars)) 
				$vars[]=$c_var."=".$up_vars[$c_var];
			elseif (array_key_exists($c_var,$_GET)) 
				$vars[]=$c_var."=".$_GET[$c_var];
		}
	}
	if ($vars) {
		$link.="?".implode("&",$vars);
		$sep = "&";
	}
	else $sep="?";

	$t_vars = array();
	if ($up_vars)
	foreach ($up_vars as $v_name=>$v_val)
	if ($v_val !== 0 && !in_array($v_name,$stored_links[$script])) $t_vars[] = $v_name."=".$v_val;

	if ($t_vars) $link .= $sep.implode("&",$t_vars);


	return $link;
}
Тут не "разрешенные параметры", а "сохраняемые". Тоесть если один раз задать один из "сохраняемых" параметров, то он будет присутствовать в каждой ссылке, сгенеренной этой функцией, пока ему не присвоят значение 0.
Применений функции нашлось много =)

-~{}~ 26.04.05 21:47:

При 1000 вызовах для 2 параметров $_GET и 3 параметров в функции, время работы (на удаленном сервере) ~0.05с
Нормально?
 
Сверху