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

Reply via email to