Req #54734 [Opn]: unpack() forces use of associative arrays

From: Date: Sat, 14 May 2011 05:17:01 +0000
Subject: Req #54734 [Opn]: unpack() forces use of associative arrays
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-160727@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=54734&edit=1 ID: 54734 Updated by: rasmus@php.net Reported by: gwynne@php.net Summary: unpack() forces use of associative arrays Status: Open Type: Feature/Change Request Package: Strings related Operating System: * PHP Version: 5.3.6 Block user comment: N Private report: N New Comment: That has never been true in any PHP version. Right from day one PHP arrays have been ordered and you have always been able to rely on that order. Previous Comments: ------------------------------------------------------------------------ [2011-05-14 07:08:04] gwynne@php.net I was under the impression that it's not safe to depend on the order of values in an associative array, i.e., that array_values(array("a" => "b", "c" => "d")) is free to return array("d", "b") if it likes. Is that untrue in the current engine? And yeah, performance is some question. Especially since I am using unpack for network packets, and the faster the better, though I haven't done any kind of benchmark to see if this is a bottleneck at all. ------------------------------------------------------------------------ [2011-05-14 06:59:05] rasmus@php.net The userland workaround is rather trivial though, isn't it? list(, $value1, $value2) = array_values(unpack("CnCnC", $packet)); array_values() is quick, but I guess your performance worry is the needless creation of the associative array in the first place? ------------------------------------------------------------------------ [2011-05-14 06:41:56] gwynne@php.net Description: ------------ The unpack() function returns only associative arrays. In some situations it's advantageous to work with an indexed array instead. For example, this code, parsing a fictional network packet format: $packet = "\x01\x05\x05\x01\x05\x05\x01"; $values = unpack("Cpadding/nvalue1/Cpadding/nvalue2/Cpadding", $packet); might be more clear when written this way: list(, $value1, , $value2, ) = unpack("CnCnC", $packet); Implementing a fully compatible workaround in userland is at least mildly annoying (as well as slow), and it's pretty simple to add to the engine. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=54734&edit=1

« previous php.bugs (#160727) next »