Вложенные именованные параметры в PHP - PullRequest
0 голосов
/ 28 января 2011

Именованные параметры отлично подходят для длинного списка опций в пользовательской функции или классе 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 ]

2 голосов
/ 28 января 2011

Существует 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;
}
1 голос
/ 28 января 2011

Почему бы просто не использовать функцию 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);

Таким образом, у вас есть массив для начала, и вам не нужно ни о чем беспокоиться, и он может принимать любое количество параметров / аргументов!

EDIT:

(Второе редактирование, в качестве первого параметра добавлены ключи $) Модифицированная функция выше, вот выход. Не уверен, какой именно формат вывода вы ищете. Таким образом, вам может понадобиться опубликовать конечную структуру массива, которую вы ищете, для ваших начальных данных.

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
)
1 голос
/ 28 января 2011

Использование array_merge_recursive().Это также объединит подмассивы.

0 голосов
/ 28 января 2011

Посмотрите, что я нашел в CakePHP framework :

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 функция слияния не может сделать это для нас, но это отличная альтернатива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...