You are here: Re: safe to delete elements of array in foreach « PHP Programming Language « IT news, forums, messages
Re: safe to delete elements of array in foreach

Posted by Schraalhans Keukenmeester on 05/19/07 04:45

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

 

Navigation:

[Reply to this 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

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