【问题标题】:PHP Warning: Illegal string offset and Invalid argument supplied for foreach()PHP 警告:为 foreach() 提供的字符串偏移量和参数无效
【发布时间】:2014-09-17 08:50:14
【问题描述】:

我收到这两个 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 ($value != '') { 替换为 if (is_array ($value)) { 将消除错误,但导航菜单仅显示具有子菜单的选项卡。我怎样才能摆脱这个 php 警告,同时确保我所有的导航菜单选项卡都显示出来?想不通。

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

【问题讨论】:

  • 您检查过$value 中的内容吗?
  • 问题在于$pages 不是一个纯二维数组,它的许多子元素都是字符串。
  • 您的条件检查值是否为空字符串。你应该检查is_array($value) &amp;&amp; array_key_exists($value['subpages'])
  • HarryFink 我收到此错误PHP Warning: array_key_exists() expects exactly 2 parameters, 1 given in
  • @HarryFink 您需要将数组和键作为字符串传递 - array_key_exists('subpages', $value)

标签: php arrays multidimensional-array


【解决方案1】:

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

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

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

【讨论】:

  • 已经在我上面的问题中提到过这个问题。它位于代码下方。无论如何,如果我使用您的建议,我仍然会收到此错误PHP Warning: Illegal string offset 'subpages'
  • 抱歉错过了 isset,我已经更新了答案
  • 太棒了!没有警告,但仍然只显示 1 个菜单选项卡。
  • 不确定您的代码是否应该工作,尝试 var_dumping 循环中的 $lis 以查看发生了什么。
  • 对我来说只是一个愚蠢的错误。我没有在 foreach 下方放置 else 语句来回显其他没有下拉菜单的选项卡。 EvilEpidemic 想通了,所以接受了他的回答。
【解决方案2】:

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

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 子菜单下面,然后看到你的编辑。警告消失了,现在所有菜单项都正常显示。
【解决方案3】:
if (isset($value['subpages']) && is_array($value['subpages'])) {
  foreach ($value['subpages'] as $subfilename => $subpageTitle) 
}

【讨论】:

  • 不会出现错误,但只显示 1 个菜单选项卡。它是带有下拉菜单的。其他 3 个不见了。
猜你喜欢
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多