|
Posted by Jon Slaughter on 05/20/07 03:11
"Jerry Stuckle" <jstucklex@attglobal.net> wrote in message
news:lcWdnQnjjd1qKdLbnZ2dnUVZ_oLinZ2d@comcast.com...
> 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.
>
since its a copy the original should effect in any way the copy?
I could only see this if the copy is not a deep copy.... but in php all
copies are deep?
[Back to original message]
|