http_build_query игнорирует ключ, если значение является пустым массивом. Как это не ошибка?

Я столкнулся с проблемой сегодня, куда я передавал ключ с набором значений к пустому массиву к http_build_query(). Например:

$args = array("foo", "bar", array(), "baz");
$qs = http_build_query($args);
echo $qs; // outputs 0=foo&1=bar&3=baz, I expected 0=foo&1=bar&2=&3=baz

Это представляет проблему для меня, так как я передаю некоторые данные внутреннему API по http, и я должен вытащить все аргументы с другой стороны.

Ну, я погуглил это и придумал следующий отчет об ошибках: http://bugs.php.net/bug.php?id=50407. Краткий ответ от администратора, "Установка Not - то же как установка его пустой. Никакая ошибка".

Кто-то может объяснить мне, почему это не ошибка? У кого-либо есть какие-либо идеи для обходного решения кроме хромого взлома устанавливания произвольного значения на одной стороне и интерпретации того значения как пустое значение на другом?

Править

Вот то, почему я думаю, что это - ошибка:

$args = array("foo", "bar", array(), "baz");
$qs = http_build_query($args);
parse_str($qs, $query);
echo ($args == $query); // false, I expect it to be true

Я предполагаю, возможно, что наивно из меня рассмотреть parse_str() и http_build_query() быть инверсиями друг друга.

Я отправляю свой текущий "хромой взлом" решение как ответ ниже.

12
задан jsdalton 28 May 2010 в 17:00
поделиться

2 ответа

Может кто-нибудь объяснить мне, почему это не ошибка?

С технической точки зрения, я не думаю, что это следует называть ошибкой. Скорее, это просто то, как они спроектировали функцию поведения, независимо от того, не согласны ли другие с этим решением или нет.

Ваш API может просто проверить с помощью if (empty ($ _ POST ['2']))

1
ответ дан 2 December 2019 в 23:31
поделиться

Это мое текущее "хромое хакерское" решение. Примечание. Мне пришлось учитывать возможность вложенных массивов, поэтому исходный массив в моем примере немного отличается от того, что я опубликовал в вопросе:

$args = array("foo", "bar", array("red", "blue", array(), "green"), "baz");
$original_array = $args; // save it to compare later
function replace_empty_array_with_fake_string(&$value, $key) {
    if (is_array($value)) {
        if (empty($value)) {
            $value = 'array()';
        } else {
            array_walk($value, 'replace_empty_array_with_fake_string');
        }

    }
}
array_walk($args, 'replace_empty_array_with_fake_string');
$qs = http_build_query($args);

// convert the query string back to an array, this would happen on the "other side"
parse_str($qs, $query);
function replace_fake_string_with_empty_array(&$value, $key) {
    if ($value == 'array()') {
        $value = array();
    }
    if (is_array($value)) {
        array_walk($value, 'replace_fake_string_with_empty_array');
    }
}
array_walk($query, 'replace_fake_string_with_empty_array');
echo ($original_array == $query); // true

Предположительно, я мог бы придумать более произвольную строку, чем "array ()", чтобы использовать ее в качестве заполнитель.

Хромой, я знаю.

1
ответ дан 2 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: