具有相同变量名的两个foreach循环打破了元素的顺序

时间:2013-08-05 15:02:40

标签: php loops foreach

这是我的代码:

foreach($datawallright['adds'] as &$ad){
    $ad['img'] = get_ad_pic_url($this->em->getReference("models\MmAds",$ad['id']),'/crop_');
    $ad['description'] = ucfirst(strip_tags(html_entity_decode(mb_strtolower(str_replace(array("___","---"),"",$ad['description']), "UTF-8"))));
    $ad['titleurl'] = title_url($ad['title']);
}

foreach($datawallright['adds'] as $ad){

    $this->load->view("view_wallpage_add",array("ad"=>$ad,"isuserwall"=>$isuserwall));
}

我有两个for循环遍历同一个数组。在这两个for循环中分配的变量是相同的。奇怪的是当它遍历第二个for循环时。第一个n-1元素是正确的,但在最后一个元素的位置,前一个元素是前一个元素。我可以在一个for循环中完成所有操作。我可以更改变量$ ad的名称,然后它可以正常工作,但我想知道发生了什么。

1 个答案:

答案 0 :(得分:4)

第一个循环是通过引用进行迭代的,所以当第二个循环尝试将“当前项目”分配给$ad时,除了更新$ad之外,它实际上还会更新您的数组内容。

最简单的解决方法是在第一个unset ($ad)之后立即添加foreach,以便PHP从那时起不会将名称$ad视为引用。

需要这样做(或者稍后会对引用进行隐藏更新)是PHP中最丑陋的事情之一;我个人非常虔诚地在通过引用迭代后附加unset,即使这是函数中的最后一个语句。