PHP警告:为foreach()提供的字符串偏移量非法且参数无效
我得到这两个php警告PHP警告:为foreach()提供的字符串偏移量非法且参数无效,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我得到这两个php警告 PHP Warning: Illegal string offset 'subpages' 及 代码行是 foreach ($value ['subpages'] as $subfilename => $subpageTitle) { 这是完整的php,您可以看到发生了什么 阵列 // Menu Items $li_1 = 'Temp Jobs'; $li_2 = 'Domestic Jobs'; $li_3 = 'HR'; $li_4 = 'Job Resu
PHP Warning: Illegal string offset 'subpages'
及
代码行是
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
//菜单项
$li_1=‘临时工’;
$li_2=‘国内工作’;
$li_3=‘HR’;
$LIU 4=‘求职简历提示’;
$pages=数组(
//临时工
“临时工、临时工、季节性工、假日工、兼职工或兼职工”=>1美元,
//国内工作(带子菜单)
$li_2=>array('pageTitle'=>$li_2,'subpages'=>array(
“保姆”或“保姆”=>“保姆”,
“保姆”=>“保姆”,
“客房服务员”=>“客房服务员”,
“管家或管家”=>“管家”,
“司机或司机”=>“司机”,
“女佣”=>“女佣”,
“管家或管家”=>“管家”,
“地产经理”=>“地产经理”,
“属性管理器”=>“属性管理器”,
“房屋经理”=>“房屋经理”,
“导师”=>“导师”,
“护理者或护理助理或CNA”=>“护理者”),
//人力资源
$li_3.'或人力资源或人力资源'=>$li_3,
//求职简历小贴士
“求职简历提示”=>4美元
);
foreach($filename=>$value的页面){
$lis=”“;
$hasCurrent=false;
if(是_数组($value)){
$href=“#菜单”;
$pageTitle=$value['pageTitle'];
}elseif(str_replace(“-”,“,$filename)=strtolower($value)){
$href=$dir_结构。$filename.'/';
$pageTitle=$value;
}否则{
$href=$dir_结构。'jobs/?position='.urlencode($filename);
$pageTitle=$value;
}
如果($value!=''){
foreach($value['subpages']为$subfilename=>$subpageTitle){
$lis.='
';
如果($position==$subfilename){
$hasCurrent=true;
}
}//foreach子菜单
回声'
';
如果($lis!=''){
回声'
;
echo$lis;
回声'
';
}//如果是lis
}//如果子菜单
回声'
';
}//每页
我已经阅读了这里的其他问题,知道我是否将if($value!=''){
替换为if(is_数组($value)){
将消除错误,但导航菜单仅显示具有子菜单的选项卡。如何消除此php警告,同时确保所有导航菜单选项卡都显示?无法理解
并非所有顶部导航选项卡都有下拉菜单。在上面的示例中,只有顶部选项卡
国内工作有下拉菜单子菜单。在循环的第一次迭代中,您尝试获取字符串的子页面索引
你还应该在循环之前做一个is_数组检查,这样就可以了
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(是数组($value)){
foreach($value['subpages']为$subfilename=>$subpageTitle){
.....
}//如果是lis
}//如果子菜单
否则{
echo';
}
您是否检查了$value
中的内容?问题是$pages
不是纯2D数组,它的许多子元素都是字符串。您的条件检查值是否为空字符串。您应该检查是否存在数组($value)和数组键($value['subpages'))
HarryFink我收到此错误PHP警告:array\u key\u exists()需要2个参数,1个参数在
@HarryFink中给定,您需要将数组和键作为字符串so-array\u key\u exists('subpage',$value)传递已经在我上面的问题中说过了。它在代码下面。无论如何,如果我使用你的建议,我仍然会收到这个错误PHP警告:非法字符串偏移量“子页面”
很抱歉错过了isset,我已经更新了我的答案太好了!没有警告,但仍然只有1个菜单选项卡显示。如果不确定你的代码看起来是否应该工作,请尝试var_dumpi找出循环中的$lis,看看发生了什么。我犯了一个愚蠢的错误。我没有在foreach下面放一个else语句来呼应其他没有下拉列表的选项卡。我明白了,所以接受了他的答案。不要出错,但只显示了一个菜单选项卡。它是一个有下拉列表的选项卡。其他3个缺少。y你抓到了和我一样的编辑。我把它放在if子菜单下面,然后看到了你的编辑。警告消失了,现在所有菜单项显示正常。
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>';
}