TP的foreach嵌套循环怎么用呢?

m573556796 2016-10-10 12:23:46
就是图片那样 r1和r2两个表 r2的外键pid指向r1的id 控制器里面我直接用select分别循环所有字段 然后前端我想r1的数据放在div1里面 如果循环输出的话会有3个div1 关键是r2的输出 我把r2的数据输出到div2里面 问题的关键是我想让r2的数据对应的和r1在一起 比如pid位1 对应的是r1里面id为1数据 我想让这些数据在一起 比如r1里面id为1的数据和r2里面pid为1的数据都输出到一起 r2里面没有pid为2的数据那么就不输出 如果按下面的情况就是每个div1里面都有所有的r2数据 这样显然是不对的 有人说使用foreach嵌套循环 可是不知道怎么使用 谁能教教我呢?


$res=$r1->select();
$res2=$r2->select();
$this->assign('res',$res);
$this->assign('res2',$res2);


<foreach name="res" item="v">
<div id="div1">
{$v.name}
<foreach name="res2" item="v2">
<div id="div2">
{$v2.number}
</div>
</foreach>
</div>
</foreach>
...全文
1470 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 15 楼 u011516112 的回复:
[quote=引用 14 楼 m573556796 的回复:] [quote=引用 12 楼 u011516112 的回复:] 或者这样写,容易理解

foreach($res as $k => $v){
          $res2 = $r2->where("pid=".$v['id'])->select();
          $res[$k]['child'] = $res2;
        }
这里就不用加&了
谢谢大神 可以了 还有个问题 这句话$res[$k]['child'] = $res2;是给$res添加了一个新的叫child属性吗?[/quote] 你可以把$res打印出来看一下,准确的说是给$res[$k]添加了一个新的元素键名叫child[/quote] 谢谢大神耐心指导
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
引用 14 楼 m573556796 的回复:
[quote=引用 12 楼 u011516112 的回复:] 或者这样写,容易理解

foreach($res as $k => $v){
          $res2 = $r2->where("pid=".$v['id'])->select();
          $res[$k]['child'] = $res2;
        }
这里就不用加&了
谢谢大神 可以了 还有个问题 这句话$res[$k]['child'] = $res2;是给$res添加了一个新的叫child属性吗?[/quote] 你可以把$res打印出来看一下,准确的说是给$res[$k]添加了一个新的元素键名叫child
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 12 楼 u011516112 的回复:
或者这样写,容易理解

foreach($res as $k => $v){
          $res2 = $r2->where("pid=".$v['id'])->select();
          $res[$k]['child'] = $res2;
        }
这里就不用加&了
谢谢大神 可以了 还有个问题 这句话$res[$k]['child'] = $res2;是给$res添加了一个新的叫child属性吗?
傲雪星枫 2016-10-10
  • 打赏
  • 举报
回复
参考:http://document.thinkphp.cn/manual_3_2.html#foreach 可以输出索引,如下: <foreach name="list" item="vo" > {$key}|{$vo} </foreach> 也可以定义索引的变量名 <foreach name="list" item="vo" key="k" > {$k}|{$vo} </foreach>
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
或者这样写,容易理解

foreach($res as $k => $v){
          $res2 = $r2->where("pid=".$v['id'])->select();
          $res[$k]['child'] = $res2;
        }
这里就不用加&了
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
引用 10 楼 m573556796 的回复:
[quote=引用 9 楼 u011516112 的回复:] 我一直用的是volist,这样写亲测可以

<volist name="res" id="v">
<div id="div1">
{$v.name}
<if condition="$v['child'] neq ''">
<volist name="v.child" id="v2">
    <div id="div2">
    {$v2.number}
    </div>
</volist>
</if>
</div>
</volist>
我复制你的代码怎么不行啊 还是显示不出来 {$v2.number}的数据 控制器这样写的

foreach($res as $v){
          $res2 = $r2->where("pid=".$v['id'])->select();
          $v['child'] = $res2;
        }
        $this->assign('res',$res);
        $this->display();
[/quote] foreach($res as &$v) 有个&不要忘!!
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 9 楼 u011516112 的回复:
我一直用的是volist,这样写亲测可以

<volist name="res" id="v">
<div id="div1">
{$v.name}
<if condition="$v['child'] neq ''">
<volist name="v.child" id="v2">
    <div id="div2">
    {$v2.number}
    </div>
</volist>
</if>
</div>
</volist>
我复制你的代码怎么不行啊 还是显示不出来 {$v2.number}的数据 控制器这样写的

foreach($res as $v){
          $res2 = $r2->where("pid=".$v['id'])->select();
          $v['child'] = $res2;
        }
        $this->assign('res',$res);
        $this->display();
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
我一直用的是volist,这样写亲测可以

<volist name="res" id="v">
<div id="div1">
{$v.name}
<if condition="$v['child'] neq ''">
<volist name="v.child" id="v2">
    <div id="div2">
    {$v2.number}
    </div>
</volist>
</if>
</div>
</volist>
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 6 楼 u011516112 的回复:
[quote=引用 5 楼 m573556796 的回复:] [quote=引用 2 楼 u011516112 的回复:] 把foreach($res => &$v)改为foreach($res as &$v) 失误
我在后台打印了一下 $v['child'] 也是有数据的 为什么前台显示不出来? [/quote] 你把第二个foreach中的name改成v.child看看可不可以,不行的话再改成$v['child'][/quote] 试了 还是不行 后台的$v['child']不用assign吗?
m573556796 2016-10-10
  • 打赏
  • 举报
回复
后台的$v['child']不用assign吗?
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
引用 5 楼 m573556796 的回复:
[quote=引用 2 楼 u011516112 的回复:] 把foreach($res => &$v)改为foreach($res as &$v) 失误
我在后台打印了一下 $v['child'] 也是有数据的 为什么前台显示不出来? [/quote] 你把第二个foreach中的name改成v.child看看可不可以,不行的话再改成$v['child']
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 2 楼 u011516112 的回复:
把foreach($res => &$v)改为foreach($res as &$v)
失误

我在后台打印了一下 $v['child'] 也是有数据的 为什么前台显示不出来?
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 2 楼 u011516112 的回复:
把foreach($res => &$v)改为foreach($res as &$v) 失误
引用 2 楼 u011516112 的回复:
把foreach($res => &$v)改为foreach($res as &$v) 失误
那个失误我改过了 还是不行 跟楼上的一样
m573556796 2016-10-10
  • 打赏
  • 举报
回复
引用 1 楼 u011516112 的回复:
按照楼主的想法 可以在第二个foreach中加入if标签进行判断,仅输出v2['pid']等于v1['id']的值 也可以这么写 控制器

$res = $r1->select();
foreach($res => &$v){
  $res2 = $r2->where("pid=".$v['id'])->select();
  $v['child'] = $res2;
}
$this->assign('res',$res);
页面

<foreach name="res" item="v">
<div id="div1">
{$v.name}
<if condition="$v['child'] neq ''">
<foreach name="v['child']" item="v2">
    <div id="div2">
    {$v2.number}
    </div>
</foreach>
</if>
</div>
</foreach>
试了一下 {$v.name}有数据 {$v2.number}没有输出数据 为什么?
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
把foreach($res => &$v)改为foreach($res as &$v) 失误
wodebaobei12611 2016-10-10
  • 打赏
  • 举报
回复
按照楼主的想法 可以在第二个foreach中加入if标签进行判断,仅输出v2['pid']等于v1['id']的值 也可以这么写 控制器

$res = $r1->select();
foreach($res => &$v){
  $res2 = $r2->where("pid=".$v['id'])->select();
  $v['child'] = $res2;
}
$this->assign('res',$res);
页面

<foreach name="res" item="v">
<div id="div1">
{$v.name}
<if condition="$v['child'] neq ''">
<foreach name="v['child']" item="v2">
    <div id="div2">
    {$v2.number}
    </div>
</foreach>
</if>
</div>
</foreach>

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧