0

名前付きパラメーターは、PHPユーザー定義関数またはクラスのオプションの長いリストに最適です。しかし、ネストされたオプションはどうですか?

例えば:

function foobar($foo,$bar,$options=array()) {

    $default_options = array('option1'=>'','option2'=>'hello','option3'=>array('option1'=>true,'option2'=>''));

    $options = array_merge($default_options,(array)$options);
}

したがって、オプション3は、サブオプションを持つ別の配列です。サブオプションもマージするために、それらをforループに入れる必要がありますか?この場合、皆さんはどうしますか?

編集:

これは関数呼び出しです:

foobar('foo','bar',array('option1'=>'foo','option3'=>array('option1'=>false)));

$ optionsの終了構造:

array(
'option1'=>'foo',
'option2'=>'hello',
'option3'=>array(
    'option1'=>false,
    'option2'=>''
);
4

4 に答える 4

2

ありますがarray_merge_recursive()、実際に期待したとおりにならない場合があります。

これは再帰的なバージョンであるかarray_merge()、実際には次のように動作しarray_merge()ます:

function array_merge_recursive_2($a, $b) {
        foreach($b as $key => $value) {
                if (isset($a[$key]) && is_array($a[$key]) && is_array($value)) {
                        $a[$key] = array_merge_recursive_2($a[$key], $value);
                } else {
                        $a[$key] = $value;
                }
        }
        return $a;
}
于 2011-01-28T16:00:02.740 に答える
1

を使用しarray_merge_recursive()ます。これにより、サブアレイもマージされます。

于 2011-01-28T15:59:53.630 に答える
1

func_get_args関数を使用しないのはなぜですか?

function yourFunction($keys) {
    $default_options = array('test', array('test1' => array('test2')), 'test3');
    $options = func_get_args();
    array_shift($options);

    $options = array_combine($keys, $options); 
    $options = array_merge($default_options, $options);

    print_r($options);
}

// Usage
yourFunction(array('option1', 'option2', 'option3', 'option4'), 'optionval1', array('optionval2-1', 'optionval2-2'), 'optionval3', 4);

このようにして、開始する配列があり、他のことを心配する必要はなく、任意の数のパラメーター/引数を受け入れることができます!

編集:

(2 回目の編集、最初のパラメーターとして $keys を追加) 上記の関数を変更しました。出力は次のとおりです。探している出力の形式が正確にわかりません。そのため、指定された初期データに対して、後の配列構造を投稿する必要がある場合があります。

Array
(
    [0] => test
    [1] => Array
        (
            [test1] => Array
                (
                    [0] => test2
                )

        )

    [2] => test3
    [option1] => optionval1
    [option2] => Array
        (
            [0] => optionval2-1
            [1] => optionval2-2
        )

    [option3] => optionval3
    [option4] => 4
)
于 2011-01-28T16:00:31.380 に答える
0

CakePHPフレームワークで見つけたものを見てください:

function merge($arr1, $arr2 = null) {

    $args = func_get_args();

    $r = (array)current($args);

    while (($arg = next($args)) !== false) {
        foreach ((array)$arg as $key => $val)    {
            if (is_array($val) && isset($r[$key]) && is_array($r[$key])) {
                $r[$key] = merge($r[$key], $val);
            } elseif (is_int($key)) {
                $r[] = $val;
            } else {
                $r[$key] = $val;
            }
        }
    }


    return $r;
}

組み込みのPHPマージ関数でこれを実行できないのは残念ですが、これは優れた代替手段です。

于 2011-01-28T17:53:03.617 に答える