| 
	
 | 
 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
 
  
Navigation:
[Reply to this message] 
 |