1

これが私のコードです:

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));
}

同じ配列を通過する 2 つの for ループがあります。この 2 つの for ループで割り当てられる変数は同じです。奇妙なのは、2 番目の for ループを繰り返すときです。最初の n-1 要素は正しいのですが、最後の要素の代わりに 1 つ前の要素が表示されます。すべてを 1 つの for ループで実行できます。変数 $ad の名前を変更すると問題なく動作しますが、何が起こったのか知りたいです。

4

1 に答える 1

4

何が起こったのかというと、最初のループが参照によって反復されるため、2 番目のループが「現在のアイテム」を$adそれに割り当てようとすると、 update に加えて配列の内容が実際に更新されます$ad

最も簡単な修正はunset ($ad)、最初の名前の直後にan を追加しforeachて、PHP がその名前$adをそれ以降の参照と見なさないようにすることです。

これを行う必要がある (そうしないと、後でリファレンスへの隠れた更新に苦しむ) ことは、PHP で最も厄介な問題の 1 つです。unset個人的には、たとえそれが関数の最後のステートメントであっても、参照による反復の後に追加することについて非常に宗教的です。

于 2013-08-05T15:05:57.963 に答える