Я искал и тестировал в течение некоторого времени и просто не могу найти, возможно ли то, что я пытаюсь достичь, так, как я это делаю.
Я хотел бы добавить пару ключ / значение в массив при определении массива на основе троичного оператора.
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 недопустимо; скорее, если начальное условие истинно, элемент вообще не должен существовать.
Любая помощь будет принята с благодарностью!
Все, что вы делаете с этим троичным оператором, — это выбираете имя ключа. Элемент будет помещен в массив, несмотря ни на что, он находится прямо в объявлении литерала массива.
Лучшее, что вы можете сделать с помощью встроенного выражения, это что-то вроде этого:
['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',
)
);