Doc #81508 [Com]: http_build_query returns empty string given ArrayIterator as input

[email protected] ("McCullough1980Alice at gmail dot com") Wed, 21 Dec 2022 09:15:44 +0000
Newsgroups php.doc.bugs
Message-ID <[email protected]>
Edit report at https://bugs.php.net/bug.php?id=81508&edit=1

 ID:                 81508
 Comment by:         McCullough1980Alice at gmail dot com
 Reported by:        mintobit at gmail dot com
 Summary:            http_build_query returns empty string given
                     ArrayIterator as input
 Status:             Open
 Type:               Documentation Problem
 Package:            URL related
 Operating System:   Linux
 PHP Version:        7.4.24
 Block user comment: N
 Private report:     N

 New Comment:

've reimplemented http_build_query to leave empty objects/arrays in the returned query string (suffixed by an '=' symbol). I've enhanced it a bit from the default functionality as well, so all-in-all:

Maintains empty objects and arrays
Changed the default enc_type to RFC3986 (relevant to the ages)
Added a key-value separator argument (ability to override the default '=')
Removes numeric indices for numerically-indexed key-value pairs
I have not tested this in a production environment (no idea about performance or bugs), and it is not optimized, but very well spelled out.

(https://www.jcpenneykiosk.site/)github.com


Previous Comments:
------------------------------------------------------------------------
[2021-10-05 19:01:13] [email protected]

Ah, yup, that is exactly what it says. My brain likes to bundle them together.

Presumably it's the same underlying change affecting both.

------------------------------------------------------------------------
[2021-10-05 18:33:36] [email protected]

> Calling get_object_vars() on an ArrayObject instance will now ...

The quoted section from the migration guide references ArrayObject, but makes no mention that the change also applies to ArrayIterator.

------------------------------------------------------------------------
[2021-10-05 16:00:28] [email protected]

> Calling get_object_vars() on an ArrayObject instance will now always return the
> properties of the ArrayObject itself (or a subclass). Previously it returned the
> values of the wrapped array/object unless the ArrayObject::STD_PROP_LIST flag
> was specified.
>
> Other affected operations are:
>
> * ReflectionObject::getProperties()
> * reset(), current(), etc. Use Iterator methods instead.
> * Potentially others working on object properties as a list, e.g. array_walk().

The third bullet point is the one that affects http_build_query().

------------------------------------------------------------------------
[2021-10-05 15:28:03] mintobit at gmail dot com

Description:
------------
Have not found anything related here https://www.php.net/manual/en/migration74.incompatible.php. Would appreciate if somebody can explain why this happened: wondering if this is expected and should be documented.

Test script:
---------------
<?php

$array = [
    ['ids' => [1,2,3,4]],
    ['key' => 1]
];

var_dump(http_build_query(new ArrayIterator($array)));

Expected result:
----------------
string(92) "0%5Bids%5D%5B0%5D=1&0%5Bids%5D%5B1%5D=2&0%5Bids%5D%5B2%5D=3&0%5Bids%5D%5B3%5D=4&1%5Bkey%5D=1"

Actual result:
--------------
string(0) ""


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=81508&edit=1