Intereting Posts

http_build_query () точка преобразуется в знак подчеркивания

Проверьте следующий массив:

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, ), );