Reply to Re: safe to delete elements of array in foreach

Your name:

Reply:


Posted by Jerry Stuckle on 05/20/07 02:38

Schraalhans Keukenmeester wrote:
> At Fri, 18 May 2007 21:05:36 -0400, Jerry Stuckle let his monkeys type:
>
>> ZeldorBlat wrote:
>>> On May 18, 11:40 am, "Jon Slaughter" <Jon_Slaugh...@Hotmail.com>
>>> wrote:
>>>> "ZeldorBlat" <zeldorb...@gmail.com> wrote in message
>>>>
>>>> news:1179501018.125313.63600@p77g2000hsh.googlegroups.com...
>>>>
>>>>> On May 18, 11:05 am, "Jon Slaughter" <Jon_Slaugh...@Hotmail.com>
>>>>> wrote:
>>>>>> Is it safe to remove elements from an array that foreach is working on?
>>>>>> (normally this is not the case but not sure in php) If so is there an
>>>>>> efficient way to handle it? (I could add the indexes to a temp array and
>>>>>> delete afterwards if necessary but since I'm actually working in a nested
>>>>>> situation this could get a little messy. I guess I could set there values
>>>>>> to
>>>>>> null and remove them afterwards?
>>>>>> Thanks,
>>>>>> Jon
>>>>> Why don't you try it and see what happens?
>>>> Um... cause I did... but that doesn't mean much. Just cause someone tries
>>>> something doesn't prove that it will always work like that...
>>>>
>>>> got any more bright ideas?
>>>>
>>>> Or is the question to hard for you?
>>> No, the question is not to (sic) hard for me. But, as you've already
>>> discovered, it isn't that difficult to test, either.
>>>
>> Sorry, I agree with Jon on this one.
>>
>> I make it a habit not to delete entries in a foreach() loop. Rather, I
>> build an array of keys I want to delete, and after the loop ends, delete
>> the entries from my delete array.
>>
>> I don't know whether an operation like this is guaranteed to work in PHP
>> - I've never seen it documented, so I suspect not. And just because it
>> works in one release under a certain set of conditions is not a
>> guarantee it will work on another release or under different conditions.
>
> I agree 100% with you not to rely on undocumented 'features'.
> Just out of curiosity I took this one step further and discovered the
> following (again, can't rely on this to hold true unless it's documented
> somewhere, well hidden):
>
> <?PHP
> $array=array('john','james','delilah','mary');
> foreach ($array as $key=>$value) {
> echo "$key => $value".NEWLINE;
> if ($value == 'delilah') {
> $array[$key]='samson';
> }
> elseif ($value=='james') {
> unset($array[$key]);
> }
> }
> echo NEWLINE;
> foreach ($array as $key=>$value) {
> echo "$key => $value".NEWLINE;
> }
> ?>
> 0 => john
> 1 => james
> 2 => delilah
> 3 => mary
>
> 0 => john
> 2 => samson
> 3 => mary
>
> The foreach loop operates on a copy of the array
> The original array remains in scope
> Current($array) points to the first element throughout the loop
>
> I'd think setting elements to NULL directly in the array isn't any better,
> you're still relying on the same 'feature'.
>
> Sh

Yes, foreach() works on a copy. But while the manual indicates changes
to the copy don't affect the original - they say nothing about when
changes to the original will affect the copy.

When I want to delete entries, I keep an array of keys to delete. When
I'm done with the array itself, I go through the second array and delete
all indicated keys.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================

[Back to original message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация