Req #54734 [Opn]: unpack() forces use of associative arrays
| From: | gwynne@php.net | Date: | Sat, 14 May 2011 05:27:04 +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-160728@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: gwynne@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:
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] rasmus@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] 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