Php-关于在foreach 中使用& 不生效问题

框架:tp5

数据库:mysql

 

场景:

1、从db中取出数据集,遍历数据集,并在每个遍历的对象中再添加属性;

2、前端需要用到render进行分页,如下

                <div class="page">
                    <div>
                        {$data->render()}
                    </div>
                </div>

问题:

1、遍历使用foreach,并且加&符,进行动态更新数据集,发现不生效(看tp社区有人说是tp bug);

2、如上问题找到原因后,进行动态添加数据,出现如下问题

Indirect modification of overloaded element of think\paginator\driver\Bootstrap has no effect

 

解决:

问题1

原因是从数据库中查出的数据集是数据集对象,不是单纯的数组(查询的数据集dump核对一下),因此,直接添加属性,类似于给一个对象赋予新的属性而已;

单独此问题解决方案,可以先$data->toArray(),将对象转成数组,再foreach &;因此说是tp5 bug,是误解;

 

问题2

原因是,进行render 分页,我通过Db select()从数据库查出来的是个数据集对象,其中包含了数据集,分页数据(总页数,当前第几页,见如下),上面的toArray显然破坏了对象的数据结构,因此,达不到分页的目的,因此会有如上错误。

think\paginator\driver\Bootstrap::__set_state(array(
   'simple' => false,
   'items' => 
  think\Collection::__set_state(array(
     'items' => 
    array (
      0 => 
      array (
        'xx_id' => 49,
        'xx_id' => 0,
        'stime' => '2019-08-07 17:00:00',
        'xxx_count' => 0,
        'xxxx_count' => 0,
        'xxx_map' => '{"x_count":0,"xx_count":0,"xx_count":0}',
      ),
    ),
  )),
   'currentPage' => 1,
   'lastPage' => 3,
   'total' => 23,
   'listRows' => 10,
   'hasMore' => true,
   'options' => 
  array (
    'var_page' => 'page',
    'path' => '/xxx.html',
    'query' => 
    array (
    ),
    'fragment' => '',
    'type' => 'bootstrap',
    'list_rows' => 15,
  ),
   'nextItem' => NULL,
))

为达到同时分页又能进行数据动态遍历重组的目的,可创建个新对象,赋值内容是取出来的数据集对象

$data_arr = $data;
$data_arr = $data_arr->items();//或$data_arr = $data_arr->toArray();
foreach($data_arr as $k=>$s_data){
    //动态替换
}

而data在不变的情况下,继续使用{$data->render()} 进行分页,需要使用到重组数据的地方,可使用重组数据,重组数据,随着data的分页也会继续分页。

 

补充:按理就算是数据集对象,将对象拆解遍历重组应该也可以生效(未尝试,有兴趣的朋友可以尝试)

 

引用tp社区 http://www.thinkphp.cn/topic/48844.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值