首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP警告:为foreach()提供的非法字符串偏移量和无效参数

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

Stack Overflow用户
提问于 2014-09-17 08:50:14
回答 3查看 2.2K关注 0票数 0

我收到了这两个php警告

代码语言:javascript
复制
PHP Warning:  Illegal string offset 'subpages'

代码语言:javascript
复制
PHP Warning:  Invalid argument supplied for foreach() in

代码行是

代码语言:javascript
复制
foreach ($value ['subpages'] as $subfilename => $subpageTitle) {

下面是完整的php,您可以看到发生了什么

阵列

代码语言:javascript
复制
// 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有下拉子菜单。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-17 09:12:36

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

代码语言:javascript
复制
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>';
}
票数 0
EN

Stack Overflow用户

发布于 2014-09-17 08:57:20

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

您还应该在循环之前进行is_array检查。这样就能行了。

代码语言:javascript
复制
if isset($value['subpages']) && (is_array($value['subpages'])) {
    foreach ($value ['subpages'] as $subfilename => $subpageTitle) {
票数 1
EN

Stack Overflow用户

发布于 2014-09-17 08:58:15

代码语言:javascript
复制
if (isset($value['subpages']) && is_array($value['subpages'])) {
  foreach ($value['subpages'] as $subfilename => $subpageTitle) 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25886103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档