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

I've experienced it 5.2.0 too so far.
Regarding the use of 'global': in fact this function was a method of a
class and the global variable was not 'global' but a property of that
same class.
I removed all this class wrapper just for this post => this is why I
used 'global' to simulate the corresponding class property.

In any case, no worries at all since I've a workaround.
Regards,
remy


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

[2007-08-16 11:19:05] [EMAIL PROTECTED]

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

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

[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..

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

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