2009-10-26 2 views
0

я получаю следующее предупреждение, перечисленные ниже в строке 3.Справка по предупреждению PHP?

Warning: Invalid argument supplied for foreach() 

Вот код PHP.

function dyn_menu($parent_array, $sub_array, $qs_val = "menu", $main_id = "nav", $sub_id = "subnav", $extra_style = "foldout") { 
     $menu = "<ul id=\"".$main_id."\">\n"; 
     foreach ($parent_array as $pkey => $pval) { 
      if (!empty($pval['count'])) { 
       $menu .= " <li><a class=\"".$extra_style."\" href=\"".$pval['link']."?".$qs_val."=".$pkey."\">".$pval['label']."</a></li>\n"; 
      } else { 
       $menu .= " <li><a href=\"".$pval['link']."\">".$pval['label']."</a></li>\n"; 
      } 
      if (!empty($_REQUEST[$qs_val])) { 
       $menu .= "<ul id=\"".$sub_id."\">\n"; 
       foreach ($sub_array as $sval) { 
        if ($pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) { 
         $menu .= "<li><a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."\">".$sval['label']."</a></li>\n"; 
        } 
       } 
       $menu .= "</ul>\n"; 
      } 
     } 
     $menu .= "</ul>\n"; 
     return $menu; 
} 

Вот весь код, над которым я работаю.

$mysqli = new mysqli("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"SELECT id, label, link_url, parent_id FROM dyn_menu ORDER BY parent_id, id ASC"); 

if (!$dbc) { 
    // There was an error...do something about it here... 
    print mysqli_error(); 
} 

while ($obj = mysqli_fetch_assoc($dbc)) { 
    if (empty($obj['parent_id'])) { 
     echo $parent_menu . $obj['id']['label'] = $obj['label']; 
     echo $parent_menu . $obj['id']['link'] = $obj['link_url']; 
    } else { 
     echo $sub_menu . $obj['id']['parent'] = $obj['parent_id']; 
     echo $sub_menu . $obj['id']['label'] = $obj['label']; 
     echo $sub_menu . $obj['id']['link'] = $obj['link_url']; 
     echo $parent_menu . $obj['parent_id']++; 
    } 
} 
mysqli_free_result($dbc); 




    function dyn_menu($parent_array, $sub_array, $qs_val = "menu", $main_id = "nav", $sub_id = "subnav", $extra_style = "foldout") { 
     $menu = "<ul id=\"".$main_id."\">\n"; 
     foreach ($parent_array as $pkey => $pval) { 
      if (!empty($pval['count'])) { 
       $menu .= " <li><a class=\"".$extra_style."\" href=\"".$pval['link']."?".$qs_val."=".$pkey."\">".$pval['label']."</a></li>\n"; 
      } else { 
       $menu .= " <li><a href=\"".$pval['link']."\">".$pval['label']."</a></li>\n"; 
      } 
      if (!empty($_REQUEST[$qs_val])) { 
       $menu .= "<ul id=\"".$sub_id."\">\n"; 
       foreach ($sub_array as $sval) { 
        if ($pkey == $_REQUEST[$qs_val] && $pkey == $sval['parent']) { 
         $menu .= "<li><a href=\"".rebuild_link($sval['link'], $qs_val, $sval['parent'])."\">".$sval['label']."</a></li>\n"; 
        } 
       } 
       $menu .= "</ul>\n"; 
      } 
     } 
     $menu .= "</ul>\n"; 
     return $menu; 
} 


function rebuild_link($link, $parent_var, $parent_val) { 
    $link_parts = explode("?", $link); 
    $base_var = "?".$parent_var."=".$parent_val; 
    if (!empty($link_parts[1])) { 
     $link_parts[1] = str_replace("&amp;", "##", $link_parts[1]); 
     $parts = explode("##", $link_parts[1]); 
     $newParts = array(); 
     foreach ($parts as $val) { 
      $val_parts = explode("=", $val); 
      if ($val_parts[0] != $parent_var) { 
       array_push($newParts, $val); 
      } 
     } 
     if (count($newParts) != 0) { 
      $qs = "&amp;".implode("&amp;", $newParts); 
     } 
     return $link_parts[0].$base_var.$qs; 
    } else { 
     return $link_parts[0].$base_var; 
    } 
} 

echo dyn_menu($parent_menu, $sub_menu, "menu", "nav", "subnav"); 

ответ

5

Это говорит о том, что $parent_array не является массивом.

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

+0

или $ sub_array не является массивом, конечно, –

+1

@ Alexey Sviridov - предположительно нет, поскольку ошибка была в строке 3. –

+1

попробуйте использовать is_array(), чтобы проверить предоставленный var перед циклом. –

3

Вы уверены, что $parent_array - это массив? Попробуйте проверить его с is_array первым (возможно, возвращая пустую строку для представления меню или любой другой - адаптироваться к вашим потребностям):

if (!is_array($parent_array)) { 
    return ""; 
} 
0

Эта ошибка происходит, когда вы поставляете не массив в forearch. Попробуйте print_r() первый аргумент каждого Еогеасп

0

Если вы измените сигнатуру функции для включения типа намекая (работает только для массивов и объектов), вы будете уверены в том, что ваша функция получает то, что ему нужно:

function dyn_menu(array $parent_array, array $sub_array, //etc.) 

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

0

Похоже, вы ожидали построить $parent_array в этом цикле while в начале. Вместо этого это всего лишь echo.

Линии нравится:

 echo $parent_menu . $obj['id']['label'] = $obj['label']; 

Если, вероятно, как:

$menu['label'] = $obj['label']; 

Тогда в конце (внутри) цикла добавить что-то вроде:

$parent_menu[$obj['id']] = $menu; 

Так вы создайте массив, который вы используете в dyn_menu.

В любом случае цикл while похож на вашу проблему. Это не здание $parent_menu по данным.

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