ID:               42236
 Updated by:       [EMAIL PROTECTED]
 Reported By:      remy215 at laposte dot net
-Status:           Open
+Status:           Feedback
 Bug Type:         Arrays related
 Operating System: debian
 PHP Version:      5.2CVS-2007-08-12
 New Comment:

Now I just want one thing cleared: Did you experience this with earlier
PHP versions than 5.2.3? As I'm quite sure it has been like this always.
And using global when not really necessary is always bad..


Previous Comments:
------------------------------------------------------------------------

[2007-08-15 23:31:55] remy215 at laposte dot net

I know that foreach reset the array.
In fact I am not looking for a workaround, I already have one.
It's just that the behavior of php looks quite unexpected to me and it
could be a bug.

Normally, calling << getParent('a0'); >> or calling <<
getParent('a0',$array); >> should lead exactly to the same result since 
when the second argument is not provided, it defaults to $array.
But that's not the case, the first call leads to an infinite loop while
the second delivers the expected result (null).

I hope I am not wrong. In any case, thanks for your help.
Regards,
Remy

------------------------------------------------------------------------

[2007-08-15 15:46:41] [EMAIL PROTECTED]

Try replace the foreach() calls with while/each struct...foreach() does
a reset on the array..

------------------------------------------------------------------------

[2007-08-15 12:47:01] remy215 at laposte dot net

Hi Jani,
First thank you for your support.
Here is a cleaner version (without the infinite-loop checking):
<?php
$array=array(
        'a0'=>array(
                'a1'=>array(
                        'a2'=>array(),
                        'b2'=>array()
                ),'b1'=>array()
        ),'b0'=>array()
);

function getParent($id,$_subtree=null) {
        $found_parent=null;
        if(!$_subtree) {
                global $array;
                $_subtree=$array;
        }
        foreach($_subtree as $parent=>$children) {
                if(in_array($id,array_keys($children))) {
                        $found_parent=$parent;
                        break;
                } elseif($found_parent=getParent($id,$children)) {
                        break;
                }
        }
        return $found_parent;
}
echo "\nparent of b2 is: ".getParent('b2'); // expected result: 'a1' --
actual result: 'a1'
echo "\nparent of a0 is: ".getParent('a0'); // expected result: null --
actual result: infinite loop
?>

What's really strange is that if you call getParent('a0',$array), it
works perfectly ! it's the [global $array; $_subtree=$array;] used for
initialization that triggers an infinite loop.

Regards,
Remy

------------------------------------------------------------------------

[2007-08-15 08:44:39] [EMAIL PROTECTED]

Please provide the simplest possible script that shows exactly what is
going wrong. The current example is too complex and seems to contain all
kinds of useless workarounds..

------------------------------------------------------------------------

[2007-08-12 21:36:09] remy215 at laposte dot net

I tested with latest cvs snapshot, still unexpectingly reseting the
array, leading to an unpredictable infinite loop.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/42236

-- 
Edit this bug report at http://bugs.php.net/?id=42236&edit=1

Reply via email to