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

Your name:

Reply:


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

Jon Slaughter wrote:
> "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
>
>

Jon,

I disagree it's "completely safe". All this is saying is that the
changes to the copy will not affect the original. It says nothing about
what changes to the original will affect.

--
==================
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

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