Edit report at http://bugs.php.net/bug.php?id=54734&edit=1
ID: 54734 Updated by: gwy...@php.net Reported by: gwy...@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: I stand corrected! That having been said, it's still a bit annoying to have to write the array_values() every time, and it does feel a bit wasteful to create an associative array, then create array from just its values, just to extract it into what's essentially another hash table (the symbol table) again. A comment in ext/standard/pack.c suggests the original author of the function rejected the ordered-array approach because it was error-prone, which now seems a little odd to me given your explanation. Previous Comments: ------------------------------------------------------------------------ [2011-05-14 07:17:00] ras...@php.net 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. ------------------------------------------------------------------------ [2011-05-14 07:08:04] gwy...@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] ras...@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] gwy...@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