php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #54734 unpack() forces use of associative arrays
Submitted: 2011-05-14 06:41 UTC Modified: 2011-05-14 07:27 UTC
From: gwynne@php.net Assigned:
Status: Open Package: Strings related
PHP Version: 5.3.6 OS: *
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: gwynne@php.net
New email:
PHP Version: OS:

 

 [2011-05-14 06:41 UTC] 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.


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-05-14 06:59 UTC] rasmus@php.net
-Status: Open +Status: Feedback
 [2011-05-14 06:59 UTC] 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 07:08 UTC] gwynne@php.net
-Status: Feedback +Status: Open
 [2011-05-14 07:08 UTC] 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 07:17 UTC] 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:27 UTC] gwynne@php.net
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.
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Fri Dec 06 08:01:24 2019 UTC