Это также полезно, если вы хотите повторно инициализировать глобальные или статически распределенные структуры.
Старый способ C использовал memset()
для установки всех элементов на 0. Вы не можете сделать это на C ++ из-за vtables и конструкторов пользовательских объектов.
Поэтому я иногда использую следующие
static Mystruct m;
for(...) {
// re-initialize the structure. Note the use of placement new
// and the extra parenthesis after Mystruct to force initialization.
new (&m) Mystruct();
// do-some work that modifies m's content.
}
Проблема в том, что хотя
$options['categories']
является действительным
$options['categories']['all']
нет.
Изменение вашей линии на
$all_categories = isset($options['categories']) &&
isset($options['categories']['all']) &&
$options['categories']['all'] ? true : false;
Подавит вашу ошибку и вернет FALSE. (перевод строки добавлен только для ясности и может быть удален)
Если вы просто пытаетесь увидеть, существует ли $options['categories']['all']
и есть ли в нем что-то, код можно упростить до:
$all_categories = !empty($options['categories']['all']);
Вам не нужно проверять, является ли $options['categories']
set, потому что если установлено
$options['categories']['all']
, то массив, который его содержит, должен быть установлен. И троичный, который возвращает true
для истинной части и false
для ложной части, добавляет ненужную сложность. Выражение перед ?
уже дает вам нужное логическое значение.