我在这段代码上获得Warning: array_push() expects parameter 1 to be array, string given in ...
array_push()
。警告发生在第一次按下,我该如何解决这个问题?
$url = $_SERVER['QUERY_STRING'];
$chunk = explode("&",$url);
array_pop($chunk);
foreach($chunk as $key => $value)
{
$pieces = explode("=",$value);
if($pieces)
{
$val = $pieces[0];
if(isset($$val))
{
array_push($$val,$pieces[1]);
}else{
$$val = array();
array_push($$val,$pieces[1]);
}
}
}
注意:我没有使用$ _GET,因为我的查询字符串可以包含多个具有相同名称的参数
?q=1&q=2&q=3&q=4
答案 0 :(得分:1)
您不需要爆炸并推送/弹出查询字符串。只需使用$ _GET超全局。
http://php.net/manual/en/reserved.variables.get.php
编辑:$ _GET是一个数组,你可以像任何其他数组一样循环它。如果你需要分别获得所有这些,那么你可以这样做:
foreach ($_GET as $key => $value) {
// whatever
}
Edit2:好的,我仍然认为无论你用这些参数做什么都是错误的方法,但如果你需要一个函数,那么你可以尝试这样的事情:
function extractVars($url)
{
$query = explode('?', $url);
$extract = array();
if (!isset($query[1])) {
return $extract;
}
$params = explode('&', $query[1]);
foreach($params as $param) {
if (strpos($param, '=') !== false) {
list($key, $value) = explode('=', $param);
$extract[$key][] = $value;
}
}
return $extract;
}
$string = 'url?a=1&a=2&a=3&b=1&b=2&b=3';
print_r(extractVars($string));
这给出了这样的输出:
Array
(
[a] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[b] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
)
答案 1 :(得分:1)
这段代码仅在$$val
已经是数组时才有效。如果不是,则会产生该错误。
array_push($$val,$pieces[1]);
所以试试这个: -
foreach($chunk as $key => $value)
{
$pieces = explode("=",$value);
if($pieces)
{
$val = $pieces[0];
if( isset($$val) && is_array($$val) ) {
array_push($$val,$pieces[1]);
} else {
$$val = array();
array_push($$val,$pieces[1]);
}
}
}
当然,使用PHP为您自动准备的$ _GET数组会更容易
发表评论后的其他想法
此警告的原因可能是您使用旧版本的PHP并使用参数register_globals = on
。
假设网址为www.xx.com?q=1&q=2&q=3
这意味着PHP已经为您创建了$q
变量。因此,第一次通过代码会发现查询字符串中的所有变量都已经存在为字符串,即PHP已经为您创建了这样的变量。
$q = '1';
$q = '2';
$q = '3';
因此,您的代码首次尝试array_push($$val,$pieces[1]);
$$val
等同于$q
,但$q
已经是标量字符串变量,因此您的错误消息。
您可以通过添加
来检查是否是这种情况print_r($GLOBALS);
就在您发布的脚本部分之前。然后检查已存在的变量的URL。
另一个想法
解释此警告的唯一方法是,无论出于何种原因,您尝试在此代码段中创建的一个或多个变量已经存在。
这个代码很可能在没有警告的情况下工作,但从那以后代码被修改了,有人在代码的早期为某些临时目的创建了一个或多个或变量。
由于您的查询字符串参数等同于
之类的变量cid, val, np, wgt, w, l, h
很可能有人使用$ w或$ l或$ h特别是在循环中用于保存值的某些临时目的。通常的做法是使用单字母变量名称来表示该变量仅在您可以在屏幕上看到的几行中使用。但是一旦人们不再需要它们就会摧毁它们,这种情况并不常见。
无论如何,值得查看是否在您的代码段之前创建了一个或多个这些变量。
添加
print_r($GLOBALS)
在您的代码段之前,看看是否已存在任何这些变量。
答案 2 :(得分:0)
鉴于网址类似于www .... php?a = b& c = d& e = f,你将它爆炸成几个元素a = b,c = d,e = f。你放弃a& b,然后继续c = d和e = f。然后你拿起c = d,将它爆炸成值c和d。因此,不太可能c是一个数组,错误信息证明了这一点。
尝试通过添加print_r($ val)和print_r($$ val)来查看内容。它应该为您提供实际评估内容的概述,并从那里开始工作。我想你会发现变量变量也没有按预期工作。
答案 3 :(得分:0)
好的伙计们,我按照你的建议去除了循环代码并用适当的代码替换它。
它现在完美无缺,这是一个简单的解决方案。
$h = $_GET["h"];
$w = $_GET["w"];
$l = $_GET["l"];
$wgt = $_GET["wgt"];
$np = $_GET["np"];
$cid = $_GET["cid"];
if (!is_array($h)) $h = [$h];
if (!is_array($w)) $w = [$w];
if (!is_array($l)) $l = [$l];
if (!is_array($wgt)) $wgt = [$wgt];
第一部分将参数逐个转换为变量,第二部分将它们转换为数组,当它是一个字符串时。
感谢您的帮助和建议。 :)
答案 4 :(得分:-4)
只需删除$$ val中的一美元($)。