PHP Pass Array to function - сохранять значения по умолчанию, если они не установлены

У меня есть функция, которая принимает массив аргументов «Параметры» для установки флагов для запроса базы данных. Это выглядит так

function c_SQL($SQL='', $FIELDS=array(), $OPTIONS=array('SINGLEROW'=>false,'foo'=>false,'bar'=>false)) {

}

Я пытаюсь сохранить ключи массива по умолчанию, если я не устанавливаю их в своем вызове функции:

$test = c_SQL($query,$fields,array('SINGLEROW'=>true));

Это генерирует ошибку внутри функции c_SQL, когда мы делаем проверки на неуказанные ключи массива (foo и bar).

Есть ли способ сохранить «foo» и «bar», если они не указаны, и изменить ключи только в том случае, если они переданы в функцию?


person Bryan Zwicker    schedule 14.05.2015    source источник
comment
Вы пробовали использовать функцию isset? Если результат окажется ложным, вы всегда можете вручную установить там переменную.   -  person Legendary_Linux    schedule 14.05.2015
comment
Это то, к чему я склонялся, если бы не было способа сохранить значения по умолчанию. Мы просто имеем дело с большим количеством передаваемых потенциальных вариантов и стараемся не проверять каждый из них.   -  person Bryan Zwicker    schedule 14.05.2015


Ответы (4)


Вы можете сохранить значения по умолчанию как константу и использовать array_merge для их применения. на ввод пользователя:

$DEFAULT_OPTIONS = array('SINGLEROW'=>false,'foo'=>false,'bar'=>false);
function c_SQL($sql='', $fields=array(), $options=array()) {
    $actual_options = array_merge($default_options, $options);
}
person Mureinik    schedule 14.05.2015
comment
Отличное предложение! Мне нравится эта идея, так как она перезапишет только те, которые они указали. - person Bryan Zwicker; 14.05.2015
comment
@BryanZwicker Это выглядит хорошо, но я думаю, что $default_options должно идти перед $options в вызове array_merge, потому что второй массив перезаписывает первый массив, и вы хотите, чтобы ваши новые параметры переопределяли значения по умолчанию. - person Cave Johnson; 14.05.2015
comment
@ Эндрю Я всегда смешиваю слишком много ;-( Хотя вы правы - я исправил ответ соответственно. Спасибо! - person Mureinik; 14.05.2015
comment
Я заметил, когда просматривал документы для array_merge(). Я подумал, что это просто недосмотр псевдокода :) Еще раз спасибо! - person Bryan Zwicker; 14.05.2015
comment
$default_options должно находиться внутри области действия функции. Это бесполезно где-либо еще, и есть риск будущего конфликта с другой переменной. Смотрите мое решение. - person Ondřej Hlaváček; 05.11.2016

Вы можете использовать array_merge внутри функции для слияния с массивом значений по умолчанию, определенным внутри функции.

function c_SQL($SQL = '', $FIELDS=array(), $OPTIONS = array()) {
    $defaults =  array(
        'SINGLEROW' => false,
        'foo' => false,
        'bar' => false  
    );
    $OPTIONS = array_merge($defaults, $OPTIONS);
    return $OPTIONS;
}

#  array ( 'SINGLEROW' => false, 'foo' => false, 'bar' => false, )
var_export(c_SQL());

# array ( 'SINGLEROW' => true, 'foo' => false, 'bar' => false, )
var_export(c_SQL(array('SINGLEROW' => true)));
person Ondřej Hlaváček    schedule 14.05.2015

Создайте параметры по умолчанию внутри тела функции, а затем объедините новые параметры с array_merge.

function c_SQL($SQL='', $FIELDS=array(), $OPTIONS=array()) {
    $DEFAULTS = array('SINGLEROW'=>false,'foo'=>false,'bar'=>false);
    $OPTIONS = array_merge($DEFAULTS, $OPTIONS);
}
person Cave Johnson    schedule 14.05.2015
comment
Спасибо за предложение! Мне нравится этот метод, он выполняет именно то, что я пытался сделать. @Mureinik опередил тебя на несколько секунд, но +1 - person Bryan Zwicker; 14.05.2015

Попробуйте назначить $OPTIONS как null или пустой массив, а затем проверьте функцию проверки, является ли он нулевым или нет, если его нуль, затем назначьте массив. Вот посмотри..

function c_SQL($SQL='', $FIELDS=array(), $OPTIONS=NULL) {
    if(empty($OPTIONS) {
        $OPTIONS=array('SINGLEROW'=>false,'foo'=>false,'bar'=>false)
    } else {
       $othervalues = array('SINGLEROW'=>false,'foo'=>false,'bar'=>false);
       $OPTIONS = array_merge($othervalues, $OPTIONS);
       //do something here
    }
}
person Coder anonymous    schedule 14.05.2015
comment
Если бы переданный массив имел только одну или две из трех требуемых опций, он все равно прошел бы ваше условие. - person Legendary_Linux; 14.05.2015