我有一个来自$ _GET的数组说
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
我正在使用这个while循环创建一个字符串:
while (list($key, $value) = each($_GET)) {
$get_url .= $key . '=' . rawurlencode(stripslashes($value)) . '&';
}
现在,如果我从$ _GET获得一个数组,请说:
Array
(
[0] => pid
[1] => gid
[2] => Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
)
然后在这种情况下可能会对while循环进行可能的更改,这样当我使用它来重定向时,我可以在url中避免像 http://www.example.com/shopping_cart.php?0=pid&1=gid&2=Array 这样的结果。 我希望网址正确显示值...不像“ 2 =数组”..我该怎么做?
修改
感谢Folks的帮助,但是我不能引入新的功能,我也不能用for循环替换while循环,如果你能帮助我重新编辑给定的WHILE循环,我将非常感谢...
编辑2
我使用header(location:$get_url)
重定向到创建的url,这是在url中显示“2 = Array”的问题吗?
编辑3
用于构建查询的函数,注意:这些功能是osCommerce的不可或缺的功能
我仍然通过将foreach循环引入其中来改变其中一个,参见下面的使用和函数定义:
function tep_redirect($url) {
if ( (strstr($url, "\n") != false) || (strstr($url, "\r") != false) ) {
tep_redirect(tep_href_link(FILENAME_DEFAULT, '', 'NONSSL', false));
}
if ( (ENABLE_SSL == true) && (getenv('HTTPS') == 'on') ) { // We are loading an SSL page
if (substr($url, 0, strlen(HTTP_SERVER . DIR_WS_HTTP_CATALOG)) == HTTP_SERVER . DIR_WS_HTTP_CATALOG) { // NONSSL url
$url = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG . substr($url, strlen(HTTP_SERVER . DIR_WS_HTTP_CATALOG)); // Change it to SSL
}
}
$url = str_replace("&", "&", $url);
header('Location: ' . $url);
tep_exit();
}
=========================
function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
global $request_type, $session_started, $SID, $spider_flag;
if (!tep_not_null($page)) {
die('</td></tr></table></td></tr></table><br><br><font color="#ff0000">' . TEP_HREF_LINK_ERROR1);
}
if ($connection == 'NONSSL') {
$link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
} elseif ($connection == 'SSL') {
if (ENABLE_SSL == true) {
$link = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG;
} else {
$link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
}
} else {
die('</td></tr></table></td></tr></table><br><br><font color="#ff0000">' . TEP_HREF_LINK_ERROR2);
}
if (tep_not_null($parameters)) {
while ( (substr($parameters, -5) == '&') ) $parameters = substr($parameters, 0, strlen($parameters)-5);
$link .= $page . '?' . tep_output_string($parameters);
$separator = '&';
} else {
$link .= $page;
$separator = '?';
}
// if session is not started or requested not to add session, skip it
if ( ($add_session_id == true) && ($session_started == true) ){
// if cookies are not set and not forced, then add the session info incase the set cookie fails
if ( ! isset($_COOKIE[tep_session_name()]) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
$_sid = tep_session_name() . '=' . tep_session_id();
// if we are chaning modes and cookie domains differ, we need to add the session info
} elseif ( HTTP_COOKIE_DOMAIN . HTTP_COOKIE_PATH != HTTPS_COOKIE_DOMAIN . HTTPS_COOKIE_PATH
&&
(
( $request_type == 'NONSSL' && $connection == 'SSL' && ENABLE_SSL == true )
||
( $request_type == 'SSL' && $connection == 'NONSSL' )
)
) {
$_sid = tep_session_name() . '=' . tep_session_id();
}
}
if (isset($_sid) && !$spider_flag) {
$link .= $separator . tep_output_string($_sid);
}
return $link;
}
===========================
function tep_get_all_get_paramtrs($exclude_array = '') {
global $HTTP_GET_VARS;
if (!is_array($exclude_array)) $exclude_array = array();
$get_url = '';
if (is_array($HTTP_GET_VARS) && (sizeof($HTTP_GET_VARS) > 0))
{
reset($HTTP_GET_VARS);
foreach($HTTP_GET_VARS as $key => $a)
{
if(is_array($a))
{
foreach($a as $k => $v)
{
$get_url[] = $key . '[]' . '=' . rawurlencode(stripslashes($v));
}
}
else
{
$get_url[] = $key . '=' . rawurlencode(stripslashes($a));
}
}
/* while (list($key, $value) = each($HTTP_GET_VARS))
{
if(!is_array($value))
{
if ( (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y') )
{
$get_url .= $key . '=' . rawurlencode(stripslashes($value));
}
}
else
{
if ( (strlen($value) > 0) && ($key != tep_session_name()) && ($key != 'error') && (!in_array($key, $exclude_array)) && ($key != 'x') && ($key != 'y') )
{
$get_url .= preg_replace('/#\d/','[]',http_build_query($value,$key.'#'));
}
/* while(list($key1, $value1) = each($value))
{
if ( (strlen($value1) > 0) && ($key1 != tep_session_name()) && ($key1 != 'error') && (!in_array($key1, $exclude_array)) && ($key1 != 'x') && ($key1 != 'y') )
{
$get_url .= $key1 . '=' . rawurlencode(stripslashes($value1));
}
}*/
/* }
}*/
$get_url .= '&';
}
return $get_url;
}
========================
tep_redirect(tep_href_link($goto, tep_get_all_get_paramtrs($parameters)));
这里$ parameters是一个带有两个值的数组,与url显示逻辑没有任何相似之处
答案 0 :(得分:2)
答案 1 :(得分:1)
如果你想从一个多维数组创建一个url,你应该使用一个递归,或者只使用内置的php函数,它与我创建的函数http-build-query()相同(就像Maurice一样) Kherlakian说。这是最简单的方法。
递归函数示例:
function URLfromArray($array,$url = "")
{
foreach($array as $key => $val)
{
if(is_array($val))
{
$url = URLfromArray($val,$url);
}
else
{
$url .= $key."=".$val."&";
}
}
return $url;
}
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以检查该值是否为数组,然后递归或迭代它......
if (is_array($value)
{
// process this array
}
else
{
// normal path
$get_url .= $key . '=' . rawurlencode(stripslashes($value)) . '&';
}
答案 4 :(得分:0)
header()与您的问题无关
你只是无法建立正确的查询字符串
我想知道为什么你的问题仍然存在,尽管所有这些http_build_query()你已经被告知了
答案 5 :(得分:-1)
您可以使用serialize将数组序列化为单个字符串,并使用urlencode生成字符串,然后在接收端使用urldecode和unserialize。