Условный элемент внутри массива (...)

Моя система отправляет массив конфигурации в такую ​​функцию:

callThatFunction( array(k1 => v1,  k2 => v2, ... kn=vn));

Я хочу сделать одну из пары ключевых значений, при условии определенных условий.

Могу ли я сделать это, не создавая переменную для массива (и это нарушит синтаксис чистой конфигурации, который создал кто-то другой)?

Подобно этому

callThatFunction ( array(
k1 => v1, 
if($cond( {k2 => v2,} 
... 
kn=vn));

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

Спасибо

Ответ 1

В конце концов я придумал следующее:

callThatFunction ( array (k1 = > v1, k2 = > v2,... kn = vn) + ($ cond? array (ключ = > значение): array()) )

По-прежнему будет ценить предложение о том, что будет более прямо выражать намерение

Ответ 2

Вы можете использовать условный оператор 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())

Теперь вам нужно решить, что более читаемо или лучше поддерживать.

Ответ 3

Поместите его после объявления массива:

$someConfig = array(
...
);

if($cond){ $someConfig['k2'] = $v2; }

Ответ 4

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

$myArray = array_filter([
    'k1' => 'v1',
    'k2' => $cond ? 'v2' : false
]);

Это позволяет вам избежать условности после факта и сделать его достаточно читаемым.

Ответ 5

Я думаю, что все эти ответы до сих пор оставят какой-то заглушку в массиве, когда условие не будет выполнено.

Я предлагаю установить массив в полном объеме, а затем использовать функцию unset для удаления тех, которые вам не нужны. Это даст чистый массив только с тем, что вы хотите, и также легко читается.

Итак...

$shapes = array('one'=>'circle, 'three'=>'triangle, 'four'=>'square', 'five'=>'pentagon')
if($i_like_curves==false){
   unset($shapes['one']);
}