Этот фрагмент кода будет работать только в том случае, если $$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]);
}
}
}
Конечно, было бы проще использовать массив $ _GET, который PHP готовит автоматически для вас
Дополнительная мысль после того, как ваш комментарий
Может быть причиной этого предупреждения является то, что вы используете старую версию PHP и имеете параметр register_globals = on
.
Так предполагая URL из 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
Ее вполне возможно, кто-то использовал $ ш или $ л или $ ч специально для некоторой временной цели в пределах цикла для хранения значения. Его обычной практикой является использование имен с единственными буквами для обозначения того, что переменная используется только в нескольких строках, которые вы можете видеть на экране. Но необычно для людей уничтожать их, как только они больше не требуются.
В любом случае его стоит посмотреть, была ли создана одна или несколько из этих переменных до вашего фрагмента кода.
Добавить
print_r($GLOBALS)
непосредственно перед фрагментом кода и посмотреть, если любой из этих переменных уже существует.
Что такое значение '$ url'? – Manwal
Почему бы просто не использовать $ _GET, который уже обрабатывал строку запроса и извлекал ее? – GordonM
Вы можете добавить дополнительную проверку 'if (isset ($$ val) && is_array ($$ val))' – sectus