tohokuaikiのチラシの裏

技術的ネタとか。

POSTした生のデータがほしいとき

PHP

<input name="foo[123]">
<input name="foo[123]_bar">

ってあった場合、$_POSTとしては$_POST[foo]しか返ってこない。

まぁ、あんまないけど、とりたい場合はfile_get_contents('php://input');を使う。

で、もうちょっと

<?php
    function post_raw_data($as_array = true)
    {
        $data = file_get_contents('php://input');
        
        $post = array();
        
        foreach (explode('&', $data) as $d){
            list($name, $value) = explode('=', $d);
            $name  = urldecode($name);
            $value = urldecode($value);
            
            if ($as_array){
                if (preg_match('/^(.*)\[(.*)\](.*)$/', $name, $m)){
                    $name = $m[1].$m[3];
                    if (!isset($post[$name])){
                        $post[$name] = array();
                    }
                    $post[$name][$m[2]] = $value;
                }
                else {
                    $post[$name] = $value;
                }
            }
            else {
                $post[$name] = $value;
            }
        }
        
        return $post;
    }