代码之家  ›  专栏  ›  技术社区  ›  Richard JP Le Guen

在PHP中通过post关闭多维数组

  •  2
  • Richard JP Le Guen  · 技术社区  · 14 年前

    有转弯的路吗 远离的 的PHP功能 Submitting a multidimensional array via POST with php ?

    因此,提交 <input type="text" name="variable[0][1]" value="..." /> 产生一个 $_POST 像这样…

    array (
        ["variable[0][1]"] => "...",
    )
    

    不像这样:

    array (
        ["variable"] => array(
                              [0] => array (
                                            [1] => "..."
                             ),
        ),
    )
    

    我在想/希望有一个模糊的php.ini指令或其他东西…?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Artefacto    14 年前

    不,但没有什么能阻止您获取查询字符串(通过 $_SERVER['QUERY_STRING'] )并手动解析。例如:

    $myGET = array();
    foreach (explode("&", $_SERVER['QUERY_STRING']) as $v) {
        if (preg_match('/^([^=])+(?:=(.*))?$/', $v, $matches)) {
            $myGET[urldecode($matches[1])] = urldecode($matches[2]);
        }
    }
    
        2
  •  0
  •   Zahymaka    14 年前

    我不该这么认为。你到底想做什么?

    例如,您可以使用变量(0)(1)或变量_0_1作为名称。

        3
  •  0
  •   Tim    14 年前

    别相信你能做到。我也不明白你为什么需要。但这应该奏效:

    $_POST['variable'] = array(array('abc','def'),array('ddd','ggg'));
    
    print_r(flatPost('variable'));
    
    function flatPost($var)
    {
        return enforceString($_POST[$var], $var);
    }
    
    function enforceString($data, $preKey = '')
    {
        if(!is_array($data))
        {
            return array($preKey . $data);
        }
    
        $newData = array();
        foreach($data as $key => &$value)
        {
            $element = enforceString($value, $preKey . '[' . $key . ']');
            $newData = array_merge($newData, $element);
        }
        return $newData;
    }
    
        4
  •  0
  •   Richard JP Le Guen    14 年前

    这有点过头了,但是如果需要,您可以手动解析请求体。

    <?php
        if(!empty($_POST) && $_SERVER['CONTENT_TYPE'] == 'application/x-www-form-urlencoded') {
                $_post = array();
                $queryString = file_get_contents('php://input'); // read the request body
                $queryString = explode('&', $queryString); // since the request body is a query string, split it on '&'
                                                           // and you have key-value pairs, delimited by '='
                foreach($queryString as $param) {
                        $params = explode('=', $param);
                        if(array_key_exists(0, $params)) {
                                $params[0] = urldecode($params[0]);
                        }
                        if(array_key_exists(1, $params)) {
                                $params[1] = urldecode($params[1]);
                        }
                        else {
                                $params[1] = urldecode('');
                        }
                        $_post[$params[0]] = $params[1];
                }
                $_POST = $_post;
        }
    ?>