Проверьте следующий массив:
Array([bunrey] => Array ([0] => 20130730181908615391000000) [mt.shasta] => Array ( [0] => 20130708203742347410000000 [1] => 20130213201456984069000000 [2] => 20130712144459481348000000 ) [shingletwon] => Array ( [0] => 20130801233842122771000000 ) )
Я хочу отправить этот массив в строку запроса с помощью http_build_query()
, после использования http_build_query()
я получил строку ниже:
bunrey%5B0%5D=20130730181908615391000000&mt.shasta%5B0%5D=20130708203742347410000000&mt.shasta%5B1%5D=20130213201456984069000000&mt.shasta%5B2%5D=20130712144459481348000000&shingletwon%5B0%5D=20130801233842122771000000
Как вы можете видеть после отправки этой строки запроса в другой файл, я пытаюсь получить. Я повторил объект $_REQUEST
:
Array ( [bunrey] => Array ( [0] => 20130730181908615391000000 ) [mt_shasta] => Array ( [0] => 20130708203742347410000000 [1] => 20130213201456984069000000 [2] => 20130712144459481348000000 ) [shingletwon] => Array ( [0] => 20130801233842122771000000 ) )
пожалуйста, проверьте один из ключей mr.shasta
был изменен на mr_shasta
. Можете ли вы, пожалуйста, предоставить какое-либо решение для этого.
Это стандартное поведение PHP. Точки преобразуются в символах подчеркивания при использовании в качестве ключей массива в запросе POST.
Из документации :
Точки и пробелы в именах переменных преобразуются в символы подчеркивания. Например <input name = "ab" /> становится $ _REQUEST ["a_b"].
Единственное решение: прекратить использование пробелов и / или точек в ключах массива при их использовании в POST-запросах или, иначе, управлять заменой строки на каждом ключе вашего ключа.
$post = array(); foreach ($_POST as $key => $value) $post[str_replace("_", ".", $key)] = $value;
Обратите внимание, что приведенный выше код исправит только проблему .
(преобразован в _
), но не в пробелы. Кроме того, если у вас есть _
в исходном ключе, это будет конвертировано в .
а также (как указано в комментариях).
Как вы можете видеть, единственное реальное решение – избежать .
и пробелы в ключах $_POST
. Они просто не могут быть получены, а не с PHP (а не с другими серверными решениями, о которых я знаю): вы потеряете эту информацию.
Нет, это не ограничение или функция дерьма: это руководство по программированию. Если вы используете имена ключей массивов для чего-то большего, чем то, что вы обычно делаете с именем переменной, вы, скорее всего, делаете что-то концептуально неправильно (и я делал это много раз).
Просто дайте вам пример о том, как это неправильно: в некоторых программных решениях, таких как asp.net-mvc (и, я думаю, codeigniter тоже), POST / GET-запросы должны отображаться над функциями в так называемом «контроллере». Это означает, что если вы отправляете POST, который выглядит как ["myKey" => "myValue", "myOtherKey" => "someValue"]
вы должны иметь функцию, которая принимает ключи в качестве аргументов.
function(String myKey, String myOtherKey){ }
PHP не имеет по умолчанию «on-top» (что я знаю), который делает это: он позволяет вам напрямую обращаться к $ _POST. Круто: но эта игрушка может легко взломать. Используйте его с осторожностью.
Возможно, я ошибаюсь, но я реплицировал то, что вы делаете, и нашел, что это зависит от того, как вы назначаете массив относительно того, изменяет ли он такой ключ:
//doesn't change to mt_shasta $array['bunrey'][0] = 20130730181908615391000000; $array['bunrey']['mt.shasta'][0] = 20130708203742347410000000; $array['bunrey']['mt.shasta'][1] = 20130708203742347410000000; $array['bunrey']['mt.shasta'][2] = 20130708203742347410000000; $array['bunrey']['shingletwon'][0] = 20130708203742347410000000; //does change to mt_shasta $array = array ( '0' => 20130730181908615391000000, 'mt.shasta' => array ( 0 => 20130708203742347410000000, 1 => 20130213201456984069000000, 2 => 20130712144459481348000000, ), 'shingletwon' => array ( 0 => 20130801233842122771000000, ), );