#49967 [Opn]: Custom iteration cannot return keys other than ints or strings

From: Date: Wed, 11 Nov 2009 12:13:29 +0000
Subject: #49967 [Opn]: Custom iteration cannot return keys other than ints or strings
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-144461@lists.php.net to get a copy of this message
 ID:               49967
 Updated by:       colder@php.net
-Summary:          Iteration over SplObjectStorage returns index=>object
                   instead of object=>data
 Reported By:      an0nym at narod dot ru
 Status:           Open
-Bug Type:         SPL related
+Bug Type:         Feature/Change Request
 Operating System: *
 PHP Version:      5.3.0
 New Comment:

This is indeed a limitation of the iteration process itself, nothing
specific to splobjectstorage.


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

[2009-10-23 10:27:31] an0nym at narod dot ru

Ah, it seems that foreach can't handle anything non-scalar as a key.
What a pity. 

I think this should be changed in the future, because it limits the use
of Iterators. For instance, I can't use something like: 

<?php
class MapObjectData extends SplObjectStorage
{
	public function key ()
	{
		return parent::current ();
	}
	
	public function current ()
	{
		return parent::getInfo ();
	}
}
$spl = new MapObjectData ();
$spl[new StdClass ()] = 'a';
$spl[new StdClass ()] = 'b';
foreach ($spl as $object => $data)
{
	var_dump ($object, $data);
}
?>

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

[2009-10-23 10:08:10] an0nym at narod dot ru

Description:
------------
Iteration over SplObjectStorage returns unexpected results: internal
index => associated object instead of object => associated data. 

Reproduce code:
---------------
<?php
$spl = new SplObjectStorage ();
$spl[new StdClass ()] = 'a';
$spl[new StdClass ()] = 'b';
foreach ($spl as $object => $data)
{
	var_dump ($object, $data);
}
?>

Expected result:
----------------
object(stdClass)#2 (0) {
}
string(1) "a"
object(stdClass)#3 (0) {
}
string(1) "b"

Actual result:
--------------
int(0)
object(stdClass)#2 (0) {
}
int(1)
object(stdClass)#2 (0) {
}


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


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



Thread (7 messages)

« previous php.bugs (#144461) next »