Я искал и тестировал какое-то время и просто не могу найти, что то, что я пытаюсь выполнить, возможно, как я это делаю.
Я хотел бы добавить пару ключ / значение в массив при определении массива на основе трехмерного утверждения.
Array( 'Item 1' => 'Some value', (FALSE)? NULL : 'Item 2' => 'Another Value' )
Мое ожидаемое / желаемое поведение заключается в следующем:
Array ( [Item 1] => Some value [Item 2] => Another Value )
И когда утверждение верно:
Array( 'Item 1' => 'Some value', (TRUE)? NULL : 'Item 2' => 'Another Value' )
Уступать:
Array ( [Item 1] => Some value )
Но вместо этого я получаю:
Array ( [Item 1] => Some value [] => Another Value )
Что вызывает проблемы, так как A) Я не хочу, чтобы этот второй элемент существовал в первую очередь и B) Значение False условия присваивается значению True conditions (в этом случае NULL, который устанавливает ключ в NULL [])
Это очень странно. Является ли мой единственный вариант иметь стандартную инструкцию if () {} и вызывать элемент, если условие является ложным (используя!) В массиве?
Примечание. Наличие нулевого значения для элемента 2 неприемлемо, но если исходное условие истинно, ни один элемент не должен существовать вообще.
Любая помощь будет принята с благодарностью!
Все, что вы делаете с этим тернарным оператором, – это определить имя ключа. Элемент будет помещен в массив независимо от того, что он находится прямо в объявлении литерала массива.
Лучшее, что вы можете сделать с встроенным выражением, это что-то вроде этого:
['foo' => 'bar'] + (true ? [] : ['baz' => 42])
Практически вам, вероятно, лучше писать:
$arr = ['foo' => 'bar']; if (true) { $arr['baz'] = 42; }
Написание более компактного кода не всегда является лучшей целью, оно должно быть читаемым и понятным в первую очередь.
Это было бы возможно только при аннулировании заявления.
Например, вы берете значение для ключа, который PHP не может обрабатывать (например, массив), и всякий раз, когда вы не хотите добавлять запись, вы используете этот ключ.
Принцип фактически аналогичен тому, что вы начертили с помощью значения NULL
:
Array( 'Item 1' => 'Some value', TRUE ? array() : 'Item 2' => 'Another Value' )
Недостатком этого является то, что код громоздкий, непонятный для чтения и дает предупреждения:
Предупреждение: тип недопустимого смещения
Поэтому я добавляю этот ответ больше для полноты.
Полный пример ( онлайн-демонстрация ):
<?php /** * PHP Ternary statement within Associative Array to set both key & value? * @link http://stackoverflow.com/a/29327671/367456 */ var_dump( Array( 'Item 1' => 'Some value', TRUE ? array() : 'Item 2' => 'Another Value', FALSE ? array() : 'Item 3' => 'Just Another Value', ) );