Ответ 1
В конце концов я придумал следующее:
callThatFunction ( array (k1 = > v1, k2 = > v2,... kn = vn) + ($ cond? array (ключ = > значение): array()) )
По-прежнему будет ценить предложение о том, что будет более прямо выражать намерение
Моя система отправляет массив конфигурации в такую функцию:
callThatFunction( array(k1 => v1, k2 => v2, ... kn=vn));
Я хочу сделать одну из пары ключевых значений, при условии определенных условий.
Могу ли я сделать это, не создавая переменную для массива (и это нарушит синтаксис чистой конфигурации, который создал кто-то другой)?
Подобно этому
callThatFunction ( array(
k1 => v1,
if($cond( {k2 => v2,}
...
kn=vn));
Вышеупомянутое явно неверно синтаксически, но должно выразить мою идею.
Спасибо
В конце концов я придумал следующее:
callThatFunction ( array (k1 = > v1, k2 = > v2,... kn = vn) + ($ cond? array (ключ = > значение): array()) )
По-прежнему будет ценить предложение о том, что будет более прямо выражать намерение
Вы можете использовать условный оператор cond ? true-expr : false-expr
:
$someConfig = array(
'k1' => 'v1',
'k2' => $cond ? 'v2a' : 'v2b'
);
Условное выражение $cond ? 'v2a' : 'v2b'
даст 'v2a'
, если $cond
имеет значение true и 'v2b'
в противном случае. Но это работает только со значением ключа.
Если вы хотите только добавить ключ на основе условия, вам нужно использовать отдельный if
:
$someConfig = array('k1' => 'v1');
if ($cond) {
$someConfig['k2'] = 'v2';
}
Изменить. Вы можете добавлять ключи условно без переменной, используя оператор объединения массива или array_merge
:
array('k1' => 'v1') + ($cond ? array('k2' => 'v2') : array())
array_merge(array('k1' => 'v1'), $cond ? array('k2' => 'v2') : array())
Теперь вам нужно решить, что более читаемо или лучше поддерживать.
Поместите его после объявления массива:
$someConfig = array(
...
);
if($cond){ $someConfig['k2'] = $v2; }
Вы можете назначить все значения и фильтровать пустые ключи из массива сразу:
$myArray = array_filter([
'k1' => 'v1',
'k2' => $cond ? 'v2' : false
]);
Это позволяет вам избежать условности после факта и сделать его достаточно читаемым.
Я думаю, что все эти ответы до сих пор оставят какой-то заглушку в массиве, когда условие не будет выполнено.
Я предлагаю установить массив в полном объеме, а затем использовать функцию unset для удаления тех, которые вам не нужны. Это даст чистый массив только с тем, что вы хотите, и также легко читается.
Итак...
$shapes = array('one'=>'circle, 'three'=>'triangle, 'four'=>'square', 'five'=>'pentagon')
if($i_like_curves==false){
unset($shapes['one']);
}