PHP тернарный оператор в ассоциативном массиве для установки ключа и значения?

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

Я хотел бы добавить пару ключ / значение в массив при определении массива на основе тернарного оператора.

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 condition присваивается значению True conditions (в этом случае NULL, который устанавливает ключ в NULL [])

это очень странно. Является ли мой единственный вариант иметь стандартный оператор if () {} и Pop элемент, если условие false (с помощью! в массив?

Примечание: наличие нулевого значения для пункта 2 неприемлемо, скорее если начальное условие истинно, элемент вообще не должен существовать.

любая помощь была бы очень признательна!

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',
    )
);