Я столкнулся с проблемой сегодня, куда я передавал ключ с набором значений к пустому массиву к 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()
быть инверсиями друг друга.
Я отправляю свой текущий "хромой взлом" решение как ответ ниже.
Может кто-нибудь объяснить мне, почему это не ошибка?
С технической точки зрения, я не думаю, что это следует называть ошибкой. Скорее, это просто то, как они спроектировали функцию поведения, независимо от того, не согласны ли другие с этим решением или нет.
Ваш API может просто проверить с помощью if (empty ($ _ POST ['2']))
Это мое текущее "хромое хакерское" решение. Примечание. Мне пришлось учитывать возможность вложенных массивов, поэтому исходный массив в моем примере немного отличается от того, что я опубликовал в вопросе:
$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 ()", чтобы использовать ее в качестве заполнитель.
Хромой, я знаю.