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

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

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

Любая помощь будет принята с благодарностью!

8

Решение

Все, что вы делаете с этим троичным оператором, — это выбираете имя ключа. Элемент будет помещен в массив, несмотря ни на что, он находится прямо в объявлении литерала массива.

Лучшее, что вы можете сделать с помощью встроенного выражения, это что-то вроде этого:

['foo' => 'bar'] + (true ? [] : ['baz' => 42])

На практике вам лучше написать:

$arr = ['foo' => 'bar'];
if (true) {
$arr['baz'] = 42;
}

Написание более компактного кода — не всегда лучшая цель, прежде всего, она должна быть читаемой и понятной.

11

Другие решения

Это было бы возможно только путем аннулирования заявления.

Например, вы берете значение для ключа, которое 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',
)
);
0

По вопросам рекламы [email protected]