之前发了一个帖子说的不清楚重新发下

2018-11-20 15:33:19 +08:00
 cc959798
 foreach ($packagetray as $tray) {
                        $bIds = explode(',', $tray['box_ids']);
                        $tmp = array_intersect($bIds, $boxsId);
                        if (!empty($tmp)) {
                            $tray['box_ids']=$bIds;
                            $skuTrays[] = $tray;
                        }
                    }


 foreach ($packagetray as $tray) {
                        $bIds = explode(',', $tray['box_ids']);
                        $tmp = array_intersect($bIds, $boxsId);
                        if (!empty($tmp)) {
                            $skuTrays[] = $tray;
                        }
                    }


两段代码,唯一的差别是这一句 $tray['box_ids']=$bIds; $tray['box_ids']本来就是字符串,第一段报错,第二段不报错。explode() expects parameter 2 to be string, array given

按理说 foreach 会更新$tray,每次取出来的是新的 tray,这时候应该不会有问题的,但是第一段就是报错

2452 次点击
所在节点    PHP
7 条回复
atroy
2018-11-20 17:44:02 +08:00
估计根源在 $packagetray
打印出来就可以发现了。

下面的测试代码是没有报错的
```
error_reporting(E_ALL);

$packagetray = array(
array(
'box_ids' => '1, 11, 11, 111, 1111',
'boxs' => 'box mix 1'
),

array(
'box_ids' => '2, 22, 222, 2222',
'boxs' => 'box mix 2'
),

array(
'box_ids' => '3, 33, 333, 3333, 33333, 3333333',
'boxs' => 'box mix 3'
),

);

foreach ($packagetray as $tray) {
$bIds = explode(',', $tray['box_ids']);
$tray['box_ids'] = $bIds;
}
```
AngryPanda
2018-11-20 17:46:46 +08:00
$tray['box_ids']=$bIds;

这句之后,$tray['box_ids'] 就是 array 了
atroy
2018-11-20 17:54:06 +08:00
@AngryPanda 嗯,这个 foreach as 后面的可以看作是一个临时变量,循环一次后,each 前面的那个数组指针就会下移,然后值重新复制给这个临时变量上。

所以这个$tray['box_ids'] 理论上在下一次循环后就被重新覆盖了。

lz 的代码看不出什么意义,但这个确实能加深对 foreach 的理解。
VgV
2018-11-21 01:05:26 +08:00
执行了 1 楼的代码没有提示错误,是不是 PHP 版本问题??
cc959798
2018-11-21 09:30:40 +08:00
@atroy 这个就是个业务代码,没什么意义的,但是我的理解是$tray boxs_id 被改变了变成数组了,但是进行下一次循环的时候应该 tray 被覆盖了才对,应该是新的 tray,新的 tray 里面的 boxs_id 是 string
cc959798
2018-11-21 09:31:40 +08:00
@atroy 指针感觉是应该下一次循环的时候才移动才对呀,提前移动不合理呀
cc959798
2018-11-21 09:32:03 +08:00
@VgV 嗯嗯,不知道是不是和框架有关,我这边用的是 yii

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509644

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX