2011-01-28 2 views
0

Именованные параметры отлично подходят для длинного списка опций в пользовательской функции или классе PHP. Но как насчет вложенных опций?Вложенные именованные параметры в 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, чтобы объединить субоптимы тоже? Что бы вы, ребята, сделали в этом случае?

EDIT:

Это вызов функции:

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

Ending структура $ опций:

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

Проверить array_merge (array1, array2); – powtac

+0

Да, но я делаю это уже: $ options = array_merge ($ default_options, (array) $ options); – DADU

+0

Еще один вариант - добавить каждый вложенный массив параметров в качестве дополнительного параметра. Трудно выбрать между вложенным массивом или одним дополнительным параметром, который делает его позиционным параметром. – DADU

ответ

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); 

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

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 
) 
+0

Это хорошо для первого шага, но как насчет слияния его со значениями по умолчанию? – DADU

+0

Отлично, вы добавили вывод.Но на самом деле не имеет смысла иметь пронумерованные ключи, потому что именованные параметры должны иметь именованные ключи. – DADU

+0

... где указаны параметры? «Option1» и т. Д. Означало значение, не обязательно имя. Вы можете передать массив «keys» в качестве первого параметра всегда, а затем переместить его и использовать 'array_combine', если хотите. Обновление с помощью этого сценария. –

1

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

+1

Эта функция не выполняет то, что можно было бы ожидать вначале. Когда ключ существует в обоих массивах, эта функция просто возвращает массив с обоими значениями в нем. (Не работает так, как ['array_merge'] (http://php.net/array_merge).) – arnaud576875

+0

Я не знал об этом, я никогда раньше не использовал функцию, просто догадался, что будет один, поскольку у PHP есть миллиарды функций, которые действительно не нужны. Во всяком случае, хорошо знать xD. –

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; 
} 
0

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