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

最終的には、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 に答える
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 に答える