Req #54734 [Opn]: unpack() forces use of associative arrays
| From: | rasmus@php.net | 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