2016-03-27 15 views
0

$ _GET配列(または$ _POSTまたは$ _COOKIE配列)からキーを取得できる関数(またはメソッド)を作成します。 $ _GET配列はフラットでも、存在しない、または多次元でもかまいません。キーは連想的であり、空のフォームが送信されたときのように常に存在するとは限りません - > URLに$ _GETパラメーターが設定されていません。

私がサポートしたいシナリオのサンプルURLは、http://www.example.com/foo?foo[name]=John&foo[color][]=red&foo[color][]=green&foo[color][]=yellow&foo[gender]=maleです。

get($foo[name]) // Return value set in input field. 
get($foo[color]) // Return array with none/one/many values (set in checkbox or multi-select, see sample code below). 

// The functions shall be similar to: 
$_GET['foo']['name'] // string 
$_GET['foo']['color'] // array 

フォームが送信されたときに、私はそのようなものとして、機能されて使用される主なユースケースをこのURLの

内容は同じGET()関数によって捕捉されなければなりません以下。フォームが送信されると、チェックボックスとラジオボタンからデータをフェッチして、設定されているかどうかを確認します。

フォームの出力例がここにあります。

例1:

Array (
    [foo] => Array (
      [name] => John 
      [color] => Array (
        [0] => red 
        [1] => green 
        [2] => yellow 
       ) 
      [gender] => male 
     ) 
) 

を実施例2:フォームが設​​定され、すべてのフィールドで掲示されるフォームは、(そう何のキーが存在しない、関数がこのシナリオをサポートしていることが重要である)空として提出されています

私が試し
Array() 

もの:

に平坦および非存在の両方を処理する機能を、以下に示すような平坦なまたは存在しない配列を有する最初の2つのシナリオは、管理が容易です配列キー。ただし、この関数は多次元配列をサポートしていません(たとえば、最大2つのディメンションレベル)。

// This will only work for a form that returns a flat $_GET array (e.g., http://www.example.com/foo?a=1&c=3). 
// `get('foo[color]')` will not do the trick. 
function get($key) { 
    if (isset($_GET[$key])) { 
     return $_GET[$key]; 
    } 
} 

私の質問は、私はまたは多次元配列とのシナリオをサポートしている同様の機能を構築することができる方法ですか?多次元配列に有効なように関数を作成するにはどうすればよいですか?

おかげで.. :-)

PS:あなたの答えはRecursiveArrayIterator()のようなものが含まれている場合、これはで動作するように挑戦することができますように、私は完全な例をいただければ幸いです。

PPS:dupeボタンを素早く実行しているレビュー担当者に:StackOverflowには$ _GETと配列に関する質問がたくさんあることを知っていますので、査読者に質問を読んでから再読してください。重複する。ここでもまた、$ _GET配列から既知のキーを得ることをサポートする関数を作成する方法を示します。$ _GET配列は多次元であり、設定されていても設定されていなくてもかまいません。

+0

希望は私がまっすぐにすることを得ました。潜在的な配列 - >多次元配列をループして結果を吐き出す何かを探していますか?再帰はどうですか? – fubbe

+0

例を使って質問を更新しました。 –

答えて

1

私にはもっときれいな感じがあります。おそらく私はその質問を誤解しています。

<?php 
$_GET = ['foo'=>[ // just for this example, don't fiddle with _GET like this in production code.... 
    'name'=>'John', 
    'colors'=>[ 
     'primary'=>['red','green','yellow'], 
     'secondary'=>['white','purple'] 
    ], 
    'gender'=>'male' 
]]; 



echo '1 ', get('foo', 'name'), "\r\n"; 
echo '2 ', var_export(get('foo', 'color'), true), "\r\n"; 
echo '3 ', var_export(get('foo', 'colors'), true), "\r\n"; 
echo '4 ', get('foo', 'colors', 'primary', 0), "\r\n"; 
echo '5 ', get('foo', 'colors', 'secondary', 1), "\r\n"; 
echo '6 ', get('foo', 'gender'), "\r\n"; 


// see http://docs.php.net//functions.arguments#functions.variable-arg-list 
function get(...$keys) { 
    $cur = $_GET; 
    foreach($keys as $k) { 
     if (!isset($cur[$k])) { 
      return FALSE; 
     } 
     else { 
      $cur = $cur[$k]; 
     } 
    } 
    return $cur; 
} 

プリント

1 John 
2 false 
3 array (
    'primary' => 
    array (
    0 => 'red', 
    1 => 'green', 
    2 => 'yellow', 
), 
    'secondary' => 
    array (
    0 => 'white', 
    1 => 'purple', 
), 
) 
4 red 
5 purple 
6 male