|
Posted by Jon Slaughter on 05/19/07 14:46
"ZeldorBlat" <zeldorblat@gmail.com> wrote in message
news:1179544257.218638.219550@u30g2000hsc.googlegroups.com...
> On May 18, 10:44 pm, Jerry Stuckle <jstuck...@attglobal.net> wrote:
>> ZeldorBlat wrote:
>> > On May 18, 9:05 pm, Jerry Stuckle <jstuck...@attglobal.net> wrote:
>> >> 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.
>>
>> >> --
>> >> ==================
>> >> Remove the "x" from my email address
>> >> Jerry Stuckle
>> >> JDS Computer Training Corp.
>> >> jstuck...@attglobal.net
>> >> ==================
>>
>> > I never said I disagreed with him -- in fact I, too, generally don't
>> > delete elements inside a foreach. However, I will say that when I
>> > have done it things seem to work as expected. I guess it all comes
>> > down to whether or not the array's internal pointer is modified when
>> > you unset the element it's pointing to (I suspect it isn't).
>>
>> > I see a lot of questions in these newsgroups that look something like,
>> > "What happens if I do X?" or "In PHP is this code valid?" The point I
>> > was trying to make (and apparently Jon took offense to it) was that
>> > it's easy enough to just try it and see what happens. Software is
>> > just that: soft. It can be changed easily enough :)
>>
>> Yes, and in a case like this that change can break his code.
>>
>> As I said - I've never seen it documented that this is valid. Maybe it
>> is and I missed it; I really don't know.
>>
>> But this isn't the same as a lot of other "try it and find out"
>> questions. In this case it's a known problem in other programming
>> languages, and if it is documented that this should or should not work,
>> no one has pointed anyone to it.
>>
>> And until I see something from the PHP developers saying it is OK, I
>> wouldn't do it.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
> This suggests that it's safe (from <http://www.php.net/foreach>):
>
> "Unless the array is referenced, foreach operates on a copy of the
> specified array and not the array itself. Therefore, the array pointer
> is not modified as with the each() construct, and changes to the array
> element returned are not reflected in the original array."
>
> So unsetting a value in the original array should not affect the copy
> that foreach is working on.
Your right. I saw this after the fact after I did try it out and compared it
with a for loop. The foreach worked while the for loop didn't. Then I went
to the manual and saw that it worked on a copy.
So in this case it should work just fine. The for looped version actually
doesn't work and does give the problem I suspected. (thought I sent a post
a bout it though).
So unless they go change how foreach works in a newer version I think it
will be safe. I'm still trying to get used to php as it does a lot of things
differently than I'm used to.
The issue with "trying it out" is that in things like this you can't be sure
since its a implementation artifact... The only way to know is to know that
foreach is working on a copy. Of course maybe one could realize that by
doing a few examples but when usually one doesn't want to rely on what they
think is going on in this sorta situation and needs to know the facts.
Of course now I know its completely safe which was my original question ;)
It came from the manual which is where I should have looked in the fist
place(I did but I guess I skipped over that part ;/
Thanks,
Jon
[Back to original message]
|