3

PHP会自动转换

<input type="text" name="foo[0]" value="x" />
<input type="text" name="foo[1]" value="y" />

进入

$_POST['foo'] = array(
    0 => 'x', 
    1 => 'y'
);

这是你最想要的。但是,在这种情况下,我不希望这种情况发生。反正有没有告诉PHP不要这样做?

我意识到我可以解析php://input自己,但如果可以避免的话,我宁愿不这样做。

我也没有重命名输入名称的选项。

4

4 回答 4

9

通过使用方括号[],您可以明确告诉 PHP 创建一个数组,但不要使用方括号:

<input type="text" name="foo_0" value="x" />
<input type="text" name="foo_1" value="y" />

这些字段将在 $_POST 数组中作为$_POST['foo_0']和可用$_POST['foo_1']

如果您对标记没有影响(这很奇怪,因为您总是可以在客户端更改它们),您需要展平数组。

$post = array();

foreach ($_POST as $key => $value) {
    if (!is_array($value)) {
        $post[$key] = $value;
    } else {
        foreach ($value as $foo => $item) {
            $post[$foo] = $item;
        }
    }
}

或者阅读一些关于数组展平的重要信息

于 2012-12-03T22:42:32.767 回答
2

我不认为您可以在不重新编译 php 的情况下禁用此功能。

我想警告您通过遍历 multi dim 数组来重建原始变量名称。您无法完全重构名称,因为 php 重命名了某些字符。例如,php 不允许在 $_POST/$_GET/etc 中的顶级数组键中使用某些字符......因此它用下划线替换 char。这使得无法区分它们,a.b a b a[b因为它们都显示为a_b。此外,与解析请求变量的数组语法相关的长期存在的错误会导致此行为。这是我几年前提交的错误报告https://bugs.php.net/bug.php?id=48597不太可能修复。

此外,magic_quotes_gpc如果启用了该设置,它会将其爪子放入阵列键中。

但是,如果您对上述这些边缘情况失败感到满意,那么您可以按如下方式重建数组:

$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($_POST));
$result = array();
foreach ($ritit as $k => $leafValue) {
    if ($ritit->getDepth() > 0) {
        $path = array($ritit->getSubIterator(0)->key());
        foreach (range(1, $ritit->getDepth()) as $depth) {
            $path[] = sprintf('[%s]', $ritit->getSubIterator($depth)->key());
        }
        $result[ join('', $path) ] = $leafValue;
    } else {
        $result[$k] = $leafValue;
    }
}


print_r($result);
于 2012-12-03T23:47:12.320 回答
0

恢复数组转换应该像这样完成:

$POST = array('foo' => array('bar', 'baz'));

foreach ($POST['foo'] as $key => $value) {
    $POST['foo['.$key.']'] = $value;
}
unset($POST['foo']);

var_dump($POST);

输出:

array(2) {
  'foo[0]' =>
  string(3) "bar"
  'foo[1]' =>
  string(3) "baz"
}
于 2012-12-03T22:53:33.080 回答
0

我最终采用了 markus-tharkun 建议的扁平化方法。对于那些感兴趣的人,这是我最终使用的代码:

function flatten($model) {
    $repeat = false;
    foreach ($model as $name => $value) {
        if (is_array($value)) {
            $repeat = true;
            foreach ($value as $sub_name => $sub_value) {
                $model["{$name}[$sub_name]"] = $sub_value;
            }
            unset($model[$name]);
        }
    }
    if ($repeat) {
        $model = flatten($model);
    }
    return $model;
}
于 2012-12-04T01:52:44.860 回答