Моя система отправляет массив конфигурации в такую функцию:
callThatFunction( array(k1 => v1, k2 => v2, ... kn=vn));
Я хочу сделать одну из ключевых пар значений, обусловленную некоторыми обстоятельствами.
Могу ли я сделать это, не создавая переменную для массива (и это нарушает чистый синтаксис конфигурации, который создал кто-то другой)?
Как это
callThatFunction ( array( k1 => v1, if($cond( {k2 => v2,} ... kn=vn));
Вышеупомянутое, очевидно, неверно синтаксически, но должно выразить мою идею.
спасибо
Вы можете использовать условный оператор cond ? true-expr : false-expr
cond ? true-expr : false-expr
:
$someConfig = array( 'k1' => 'v1', 'k2' => $cond ? 'v2a' : 'v2b' );
Условное выражение $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; }
В конце концов я придумал следующее:
callThatFunction (массив (k1 => v1, k2 => v2, … kn = vn) + ($ cond? array (ключ => значение): array () ))
Будет по-прежнему ценить предложение о том, что будет более прямо выражать намерение
Вы можете назначать все значения и фильтровать пустые ключи из массива одновременно:
$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']); }
эта$shapes = array('one'=>'circle, 'three'=>'triangle, 'four'=>'square', 'five'=>'pentagon') if($i_like_curves==false){ unset($shapes['one']); }
не$shapes = array('one'=>'circle, 'three'=>'triangle, 'four'=>'square', 'five'=>'pentagon') if($i_like_curves==false){ unset($shapes['one']); }