tags:

views:

65

answers:

5

I keep getting the following warning listed below on line 3.

Warning: Invalid argument supplied for foreach()

Here is the php code.

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

Here is the whole code I'm working on.

$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  A: 

It's telling you that $parent_array isn't an array.

If you post the code that calls this function, we can tell you more.

R. Bemrose
or $sub_array isn't an array of course
Alexey Sviridov
@Alexey Sviridov - presumably not, since the error was on line 3.
Dominic Rodger
try using is_array() to check provided var before looping.
Daren Schwenke
oh, missed it...
Alexey Sviridov
+3  A: 

Are you sure $parent_array is actually an array? Try checking it with is_array first (perhaps returning an empty string to represent the menu or whatever - adapt to your needs):

if (!is_array($parent_array)) {
    return "";
}
Dominic Rodger
A: 

This error happens when you supply not an array into forearch. Try print_r() first argument of every foreach

Alexey Sviridov
A: 

If you change your function signature to include type hinting (only works for arrays and objects), you'll be sure that your function gets what it needs:

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

And you should get an error message that pinpoints the caller of the function, which is where the problem really is.

dnagirl
A: 

It looks like you were expecting to build $parent_array in that while loop at the beginning. Instead it's just echoing stuff.

The lines like:

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

Should probably be like:

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

Then at the end (inside) of the loop add something like:

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

So you build the array you're using in dyn_menu.

In any case, the while loop looks like your problem. It's not building $parent_menu from the data.

joeshmo