#44485 [Opn]: array_splice behaves unexpectedly when given an object as the last argument

From: Date: Thu, 20 Mar 2008 13:44:36 +0000
Subject: #44485 [Opn]: array_splice behaves unexpectedly when given an object as the last argument
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-616@lists.php.net to get a copy of this message
ID: 44485 User updated by: computerlov at yahoo dot com Reported By: computerlov at yahoo dot com Status: Open Bug Type: Documentation problem Operating System: windows xp PHP Version: 5.2.5 New Comment: so If i do this $arr = array($oSomeObject); array_splice(..., 0, 2, $arr); will it work as I intended? I'll check that later. Previous Comments: ------------------------------------------------------------------------ [2008-03-20 11:02:39] felipe@php.net The documentation describe the fourth parameter as array, but the correct is mixed. Reclassified as Documentation problem. ------------------------------------------------------------------------ [2008-03-20 10:58:03] felipe@php.net > I just noticed something you did wrong when reproducing the bug: > the error is on the array we splice and not the output. Oh, ok! > instead of getting an array of 9 objects, you get > an array of 8 objects and all the data members of > CSomeClass in the array. The data of 'replacement' parameter is converted to array, then, the object is converted to an array of their properties. This is expected. Thanks. ------------------------------------------------------------------------ [2008-03-19 23:01:16] computerlov at yahoo dot com I just noticed something you did wrong when reproducing the bug: the error is on the array we splice and not the output. for example: $arrInput = {$obj1, $obj2......} $arrOutput = array_splice($arrInput, .......); the problem is in $arrInput (which is passed by reference to array_splice) and not $arrOutput. ------------------------------------------------------------------------ [2008-03-19 22:54:48] computerlov at yahoo dot com My complete example is a bit long. I'm basically creating an array of references to an object like so: $oEmptyObject = new CObject(NULL); $nMaxIndex = 64; for ($nCurIndex = 0; $nCurIndex < $nMaxIndex; ++$nCurIndex) { $this -> m_arrDailyObjects[0][$nCurIndex] = &$oEmptyObject; } on a different function i attempted to exchange the first two elements of the given array with one new CObject that actually contained data. I did it as followed: // this is an array containing all the objects with no particular order. $this -> m_arrObjects[count($this -> m_arrObjects)] = new CObject($arrFromDatabseData); // this is an array that saves the objects in a very specific order. array_splice($this -> m_arrDailyObjects[0], 0, 2, $this -> m_arrObjects[count($this -> m_arrObjects) - 1]); this resulted in the unexpected response. Note: I simplified a my code for a bit by replacing some loops and variables with literal indexes to keep it understandable without having to understand all my loops. CObject is a class with public and private methods, private data members, and of course a constructor, destructor. Nothing fancy. Let me know if you manage to reproduce it. ------------------------------------------------------------------------ [2008-03-19 21:34:28] felipe@php.net Please, send the complete example. I can't reproduce. <?php class CSomeClass { private $m_var1; private $m_var2; } $oSomeClass = new CSomeClass(); $arrObjects = array(); for ($i = 0; $i < 10; $i++) { $arrObjects[] = new stdClass; } var_dump(array_splice($arrObjects, 8, 2, $oSomeClass)); /* Output: array(2) { [0]=> object(stdClass)#10 (0) { } [1]=> object(stdClass)#11 (0) { } } */ ------------------------------------------------------------------------ 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/44485 -- Edit this bug report at http://bugs.php.net/?id=44485&edit=1

« previous php.doc.bugs (#616) next »