目前项目中碰到一个难题:php的多维数组(大于4维),输出到模板上之后,无法正常解析,导致第三层循环里没有数据。本地开发环境:vertrigoserv(php6.2.6+mysql5.1+apache),模板使用的是smarty。在此环境下程序执行正常,在模板上面有<tpl>$array[0][body][0][body][0].name</tpl>这样的语句也能正常输出。三重循环也能取到所有的数据。服务器环境: IIS6.0+php5.2.5+mysql5.0 在服务器上从php文件直接echo $array[0][body][0][body][0][name],页面输出正常结果。但是这个$array传给模板后,在模板上只能取到四维数组的结果,如<tpl>$array[0][body][0].name</tpl>正常输出,但是<tpl>$array[0][body][0][body][0].name</tpl>就没有任何值了。 调试步骤:1.怀疑是php版本问题,于是将本地开发环境换成php5.2.5,本机上仍然正常。2.在模板上设置中间变量,将四维数组给中间变量,再输出仍然不正常(server上)。 因为服务器是几个网站公用的,不方便修改调试,单机上也没有IIS,不知道到底是什么原因。  虽然我采用别的逻辑,将数组降维,解决了这个问题,但还是想搞清楚为什么会有这样的现象。近来项目比较紧,这个问题先放这里,以后慢慢研究,也希望看到这篇文章的高人点拨一下。

解决方案 »

  1.   

    php代码
    $remind = array(
    array('name'=>$lang_obj->_lang['langResumeSale'],'tag'=>'saler','body'=>array(
    array('name'=>$lang_obj->_lang['langResumeBabyManage'],'tag'=>'sale_product','body'=>array(
    array('name'=>$lang_obj->_lang['langResumeBabyMoveOther'],'tag'=>'sale_product_move','mail_check'=>'1','mail_disabled'=>'1','msg_check'=>'0','msg_disabled'=>'0','must'=>'1'),
    array('name'=>$lang_obj->_lang['langResumeBabyDelOther'],'tag'=>'sale_product_del','mail_check'=>'1','mail_disabled'=>'1','msg_check'=>'0','msg_disabled'=>'0','must'=>'1'),
    array('name'=>$lang_obj->_lang['langResumeBabyDownOther'],'tag'=>'sale_product_down','mail_check'=>'1','mail_disabled'=>'1','msg_check'=>'0','msg_disabled'=>'0','must'=>'1'),
    ),
    ),
    )
    ),
    array('name'=>$lang_obj->_lang['langResumeBuyRemind'],'tag'=>'buyer','body'=>array(

    array('name'=>$lang_obj->_lang['langResumeMessageInform'],'tag'=>'buyer_message','body'=>array(
    array('name'=>$lang_obj->_lang['langResumeBabyMessageBySaleInform'],'tag'=>'buyer_message_seller_product_answer','mail_check'=>'1','mail_disabled'=>'0','msg_check'=>'0','msg_disabled'=>'0','must'=>'0'),
    array('name'=>$lang_obj->_lang['langResumeShopMessageBySaleInform'],'tag'=>'buyer_message_seller_shop_answer','mail_check'=>'0','mail_disabled'=>'0','msg_check'=>'0','msg_disabled'=>'0','must'=>'0'),
    ),
    ),
    )
    ),

    array('name'=>$lang_obj->_lang['langResumeComplaintLawRemind'],'tag'=>'complaint','body'=>array(
    array('name'=>$lang_obj->_lang['langResumeLaw'],'tag'=>'complaint_other_answer','body'=>array(
    array('name'=>$lang_obj->_lang['langResumeMyComplaintLawSideInform'],'tag'=>'complaint_other_answer_notice','mail_check'=>'1','mail_disabled'=>'0','msg_check'=>'1','msg_disabled'=>'0','must'=>'1'),
    ),
    ),
    )
    ),
    );
    foreach ($remind as $k => $v){
    if (is_array($v['body'])){
    foreach ($v['body'] as $k2 => $v2){
    if (is_array($v2['body'])){
    foreach ($v2['body'] as $k3 => $v3){
    $line = @explode('|',$array[$v3['tag']]);
    $remind[$k]['body'][$k2]['body'][$k3][$v3['tag']] = array('mail_check'=>$line[0],'msg_check'=>$line[1]);
    }
    }
    }
    }
    }

    //print_r($remind_array);此时两个环境下都会输出正确的数组
    $this->output('remind_array',$remind);//变量输出到模板
    $this->showpage('own_remind.manage');//调用页面
    ?>模板输出代码<tpl> $remind_array[0][body][0].name </tpl>//有值
    <tpl> $remind_array[0][body][0][body][0].name </tpl>//空值
    <tpl> foreach from=$remind_array item=one </tpl>
    <tpl> foreach from=$one.body item=two </tpl>
    <tpl> foreach from=$two.body item=three </tpl>
    //这里的<tpl>$three.name</tpl>值就为空
    <tpl> /foreach </tpl>
    <tpl> /foreach </tpl>
    <tpl> /foreach </tpl>
       
      

  2.   


      这不是smarty吧? 
      

  3.   

    tpl error,try this.<tpl> $remind_array[0].body[0].name </tpl>//有值
    <tpl> $remind_array[0].body[0].body[0].name </tpl>//空值
    <tpl> foreach from=$remind_array item=one </tpl>
    <tpl> foreach from=$one.body item=two </tpl>
    <tpl> foreach from=$two.body item=three </tpl>
    //这里的<tpl>$three.name</tpl>值就为空
    <tpl> /foreach </tpl>
    <tpl> /foreach </tpl>
    <tpl> /foreach </tpl>