2014-09-04 2 views
2

Я получаю Warning: array_push() expects parameter 1 to be array, string given in ... для array_push() на этом фрагменте кода. Предупреждение возникает при первом нажатии, как я могу это исправить?Предупреждение: array_push() ожидает, что параметр 1 является массивом, указанная строка

$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

Что такое значение '$ url'? – Manwal

+2

Почему бы просто не использовать $ _GET, который уже обрабатывал строку запроса и извлекал ее? – GordonM

+0

Вы можете добавить дополнительную проверку 'if (isset ($$ val) && is_array ($$ val))' – sectus

ответ

-4

Просто удалите один доллар ($) в $$ Валу.

+0

Что вы, ребята, делаете ????????Это не шутка – Manwal

+0

Вы слишком пропустили цель '$$' полностью. [Руководство] (http://php.net/manual/en/language.variables.php) – RiggsFolly

+0

http://php.net/manual/en/language.variables.variable.php Вы почти никогда не хотите их использовать потому что они очень запутывают, но они являются законной частью языка. – rich97

1

Вам не нужно взорваться и нажать/вывести строку запроса. Просто используйте супергелбал $ _GET.

http://php.net/manual/en/reserved.variables.get.php

Edit: $ _GET является массивом, вы можете цикл над ним таким же образом, как и любой другой массив. Если вам нужно, чтобы получить все из них в отдельности, то вы можете сделать это:

foreach ($_GET as $key => $value) { 
    // whatever 
} 

edit2: Хорошо, я все еще думаю, что все, что вы делаете с этим Params является неправильным способом сделать это, но если вам нужна функция то вы можете попробовать что-то вроде этого:

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 
) 
) 
+0

Это потребует от меня повторной записи всего кода и GET каждой переменной по одному, что хорошо, если у вас есть 1 или 2 переменных, но нет, если их у вас их много. Код работает нормально, я просто получаю это предупреждение и хотел бы узнать, как избавиться от него. –

+0

$$ val может быть или не быть массивом. Тот же самый параметр запроса может повторяться более одного раза, как & q = 123 & q = 456 & q = 789 –

+0

@BrunoDomingues. Ваш код работает не очень хорошо. Это предупреждение. Код, который работает, не вызывает предупреждений. Это также противоречит интуиции, большинство программистов PHP будут ожидать, что вы будете использовать $ _GET, чтобы получить параметры строки запроса. Любой код, который этого не делает, будет иметь более высокий коэффициент «WTF/Minute», чем он должен. http://www.osnews.com/story/19266/WTFs_m – GordonM

0

Учитывая, что URL-адрес что-то вроде WWW .... PHP A = B & с = 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). Он должен дать вам обзор того, что на самом деле оценивается, и работать оттуда. Я думаю, вы обнаружите, что переменная переменная не работает так, как ожидалось.

+0

URL-адрес не такой, он может быть a = b & a = c & a = d & b = 1 & b = 2 & b = 3 –

+0

Учитывая код, он по-прежнему не дает вам массив для $$ a по умолчанию. Вы должны определить его во-первых, или, может быть, в качестве альтернативы такой конструкции, как $$ a [] = $ b, однако я не могу ее протестировать в месте, где я сейчас. – cootje

0

Этот фрагмент кода будет работать только в том случае, если $$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) 

непосредственно перед фрагментом кода и посмотреть, если любой из этих переменных уже существует.

+0

$$ val может быть или не содержать массив. Тот же самый параметр запроса может повторяться более одного раза, как & q = 123 & q = 456 & q = 789 –

+0

Ну, это объясняет, почему вы не используете массив $ _GET. – RiggsFolly

+0

Смотрите мой дополнительный, хотя на основе вашего комментария – RiggsFolly

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]; 

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

Благодарим за помощь и совет. :)

Смежные вопросы