PHP警告:为foreach()提供了非法的字符串偏移量和无效的参数


PHP Warning: Illegal string offset and Invalid argument supplied for foreach()

我收到这两个php警告

PHP Warning:  Illegal string offset 'subpages'

PHP Warning:  Invalid argument supplied for foreach() in

代码行是

foreach ($value ['subpages'] as $subfilename => $subpageTitle) {

这是完整的php,所以你可以看到上发生了什么

阵列

// Menu Items
$li_1 = 'Temp Jobs';
$li_2 = 'Domestic Jobs';
$li_3 = 'HR';
$li_4 = 'Job Resume Tips';
$pages = array(
    // Temp Jobs
    'temp or temporary or seasonal or holiday or part-time or pt' => $li_1,
    // Domestic Jobs (with submenu)
    $li_2 => array('pageTitle' => $li_2, 'subpages' => array(
        'Baby-Sitter or Babysitter' => 'Babysitter',
        'Nanny' => 'Nanny',
        'Room-Attendant' => 'Room Attendant',
        'Butler or Houseman' => 'Butler',
        'Chauffeur or Chauffeuse' => 'Chauffeur',
        'Maid' => 'Maid',
        'Housekeeper or House-Keeper' => 'Housekeeper',
        'Estate-Manager' => 'Estate Manager',
        'Property-Manager' => 'Property Manager',
        'House-Manager' => 'House Manager',
        'Tutor' => 'Tutor',
        'Caregiver or Nursing-Assistant or CNA' => 'Caregiver')),
    // HR
    $li_3.' or Human-Resource or Human-Resources' => $li_3,
    // Job Resume Tips
    'job-resume-tips' => $li_4
);
foreach ($pages as $filename => $value) {
$lis = "";
$hasCurrent = false;
if (is_array ($value)) {
    $href = '#menu';
    $pageTitle = $value ['pageTitle'];
} elseif (str_replace("-"," ", $filename) == strtolower($value)) {
    $href = $dir_structure.$filename.'/';
    $pageTitle = $value;
} else {
    $href = $dir_structure.'jobs/?position='.urlencode($filename);
    $pageTitle = $value;
}
if ($value  != '') {
    foreach ($value ['subpages'] as $subfilename => $subpageTitle) {
        $lis .= '
                <li'.(($position == $subfilename) ? ' class="current"' : '').'><a href="'.$dir_structure.'jobs/?position='.urlencode($subfilename).'">'.$subpageTitle.'</a></li>';
            if ($position == $subfilename) {
                $hasCurrent = true;
            }
    } // foreach sub_menus
    echo '
        <li'.($hasCurrent || $value == $currentPage || $position == $filename ? ' class="current"' : '').'>
        <a href="'.$href.'">'.$pageTitle.'</a>';
    if($lis != '') {
        echo '
            <ul class="subMenu">';
        echo $lis;
        echo '
            </ul>';
    } // if lis
} // if sub_menus
echo '
        </li>';
} // foreach pages

我已经阅读了这里的其他问题,知道如果用if (is_array ($value)) {替换if ($value != '') {会消除错误,但导航菜单只显示具有子菜单的选项卡。我如何才能摆脱这个php警告,同时确保我的所有导航菜单选项卡都显示出来?搞不清楚。

并不是我所有的顶部导航选项卡都有下拉菜单。在上面的示例中,只有顶部选项卡Domestic Jobs具有下拉子菜单。

在循环的第一次迭代中,您正在尝试获取字符串的子页面索引。

您还应该在循环之前进行is_array检查。所以这是可行的。

if isset($value['subpages']) && (is_array($value['subpages'])) {
    foreach ($value ['subpages'] as $subfilename => $subpageTitle) {

这似乎达到了预期的效果;

if(is_array($value)) {
    foreach ($value ['subpages'] as $subfilename => $subpageTitle) {
    .....
    } // if lis
} // if sub_menus
else {
    echo '<li class="current"><a href="'.$href.'">'.$pageTitle.'</a>';
}
if (isset($value['subpages']) && is_array($value['subpages'])) {
  foreach ($value['subpages'] as $subfilename => $subpageTitle) 
}