Вы сказали:
как сделать множественный выбор
<?=$page['index']['menu'] ?? $page['deals']['menu'] ?? $page['search']['menu'] ?>
В вашем PHP-фрагменте используется оператор null coalescing (??), который возвращает первое значение, которое существует и не равно null. Это работает как выбор одного значения из нескольких, но не для множественного выбора.
Если вам нужно собрать несколько значений (множественный выбор), вы можете использовать массив и фильтровать только те элементы, которые существуют:
php$menus = [];
if (!empty($page['index']['menu'])) {
$menus[] = $page['index']['menu'];
}
if (!empty($page['deals']['menu'])) {
$menus[] = $page['deals']['menu'];
}
if (!empty($page['search']['menu'])) {
$menus[] = $page['search']['menu'];
}
Теперь в $menus у вас будет массив из всех существующих menu.
array_filter:php$menus = array_filter([
$page['index']['menu'] ?? null,
$page['deals']['menu'] ?? null,
$page['search']['menu'] ?? null
]);
array_filter убирает все null, пустые строки и другие "пустые" значения.
php$menuOutput = implode("\n", array_filter([
$page['index']['menu'] ?? null,
$page['deals']['menu'] ?? null,
$page['search']['menu'] ?? null
]));
echo $menuOutput;
Такой код выведет все доступные menu, разделённые переносом строки.
Если под «множественным выбором» вы имели в виду что-то другое (например, флажки в HTML или логику интерфейса), уточните — помогу точнее.
Ваш код:
php<?=$page['index']['menu'] ? $page['deals']['menu'] ? $page['search']['menu'] ?>
некорректен по синтаксису и логике, потому что:
Вы используете тернарный оператор (?) без полного синтаксиса.
Тернарный оператор требует трёх частей: условие ? если_да : если_нет
Вложенность без скобок делает код трудно читаемым и потенциально ошибочным.
Если вы хотите последовательно проверить menu в разных разделах и вернуть первый, который существует, используйте:
php<?= $page['index']['menu'] ?? $page['deals']['menu'] ?? $page['search']['menu'] ?>
Этот код говорит: верни index.menu, если он есть; если нет — deals.menu; если и его нет — search.menu.
menu, то так:php<?php
$menus = array_filter([
$page['index']['menu'] ?? null,
$page['deals']['menu'] ?? null,
$page['search']['menu'] ?? null
]);
foreach ($menus as $menu) {
echo $menu;
}
?>
Если объясните, что именно вы хотите достичь — выбрать первое, вывести все, объединить или что-то другое — я помогу с точным кодом.
Отлично! Если вы хотите не просто вывести значение, а понять и вывести, какая из переменных задана (index, deals или search), то вот пример, как это сделать:
php<?php
if (!empty($page['index']['menu'])) {
echo 'index.menu';
} elseif (!empty($page['deals']['menu'])) {
echo 'deals.menu';
} elseif (!empty($page['search']['menu'])) {
echo 'search.menu';
} else {
echo 'menu не найден';
}
?>
!empty(...) проверяет, существует ли значение и не пустое ли оно.
echo выводит имя найденного ключа, а не его значение.
php<?php
if (!empty($page['index']['menu'])) {
echo 'index.menu: ' . $page['index']['menu'];
} elseif (!empty($page['deals']['menu'])) {
echo 'deals.menu: ' . $page['deals']['menu'];
} elseif (!empty($page['search']['menu'])) {
echo 'search.menu: ' . $page['search']['menu'];
} else {
echo 'menu не найден';
}
?>
Если нужно вернуть это внутри <?= ... ?>, то можно через тернарные операторы, но это будет хуже читаться. Лучше оставить в <?php ... ?>.
Хочешь версию в одну строку — скажи, сделаю.
Чтобы в одну строку получить и значение, и понять, какой из ключей сработал, можно использовать анонимную функцию или просто match (начиная с PHP 8.0) — но самый простой способ на PHP < 8 — это тернарный оператор в цепочке:
php<?= !empty($page['index']['menu']) ? 'index.menu' : (!empty($page['deals']['menu']) ? 'deals.menu' : (!empty($page['search']['menu']) ? 'search.menu' : 'menu не найден')) ?>
php<?= !empty($page['index']['menu']) ? 'index.menu: ' . $page['index']['menu'] : (!empty($page['deals']['menu']) ? 'deals.menu: ' . $page['deals']['menu'] : (!empty($page['search']['menu']) ? 'search.menu: ' . $page['search']['menu'] : 'menu не найден')) ?>
match (PHP 8.0+):php<?php
echo match (true) {
!empty($page['index']['menu']) => 'index.menu: ' . $page['index']['menu'],
!empty($page['deals']['menu']) => 'deals.menu: ' . $page['deals']['menu'],
!empty($page['search']['menu']) => 'search.menu: ' . $page['search']['menu'],
default => 'menu не найден',
};
?>
Если нужна именно минимальная компактная форма — тернарный оператор в одну строку (первый вариант) будет самым универсальным.
Ваши примеры записаны с синтаксическими ошибками и нелогичными проверками, вот почему они не работают:
<?= !empty(...) ? !empty(...) — вы дважды проверяете !empty(...), но ничего не выводите, кроме true/false.
Оператор ?? используется неправильно — он не сочетается с : как тернарный.
Нет закрывающих скобок )) и ?> — PHP выдаст фатальную ошибку.
Если вы хотите вывести значение первого существующего меню, то:
php<?= $page['index']['menu'] ?? $page['deals']['menu'] ?? $page['search']['menu'] ?? 'menu не найден' ?>
Если вы хотите вывести, откуда это значение (index, deals, search), то:
php<?= !empty($page['index']['menu']) ? 'index.menu: ' . $page['index']['menu']
: (!empty($page['deals']['menu']) ? 'deals.menu: ' . $page['deals']['menu']
: (!empty($page['search']['menu']) ? 'search.menu: ' . $page['search']['menu']
: 'menu не найден')) ?>
!empty(...) ? ... : ... — стандартный тернарный оператор.
?? возвращает первое существующее значение (включая пустую строку, если она есть!).
!empty(...) исключает пустые строки и null.
Если всё ещё не работает — пришлите структуру массива $page, я помогу точнее.
Ты на правильном пути! Ниже я улучшу и прокомментирую твой HTML/PHP-фрагмент. Основная идея — задать активный класс для нужного пункта меню в зависимости от текущей страницы (через $page['...']['menu']).
Ты используешь логику:
php<?= !empty($page['index']['menu']) ? $page['index']['menu'] : (!empty($page['deals']['menu']) ? $page['deals']['menu'] : (!empty($page['search']['menu']) ? $page['search']['menu'] : '')) ?>
Это правильно, но можно упростить и сделать читаемее.
php<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle <?=
$page['index']['menu'] ??
$page['deals']['menu'] ??
$page['search']['menu'] ?? '' ?>"
href="/" role="button" data-bs-toggle="dropdown" aria-expanded="false">СДЕЛКИ</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item <?= $page['index']['menu'] ?? '' ?>" href="/">СПИСОК СДЕЛОК</a></li>
<li><a class="dropdown-item <?= $page['deals']['menu'] ?? '' ?>" href="?page=deals">ТАБЛИЦА СДЕЛОК</a></li>
<li><a class="dropdown-item <?= $page['search']['menu'] ?? '' ?>" href="?page=search">ПОИСК СДЕЛОК</a></li>
</ul>
</li>
И аналогично для остальных блоков (ПОЧТА, УПРАВЛЕНИЕ, НОМЕНКЛАТУРА).
menuОбычно значение $page['...']['menu'] — это 'active' или ''. Например:
php$page = [
'deals' => ['menu' => 'active'],
'index' => ['menu' => ''],
...
];
Такой подход позволяет добавить нужный класс для подсветки активного пункта Bootstrap-меню.
Чтобы избежать повторения <?= $page['...']['menu'] ?? '' ?>, можно создать функцию:
php<?php
function menu_class(...$keys) {
global $page;
foreach ($keys as $key) {
if (!empty($page[$key]['menu'])) {
return $page[$key]['menu'];
}
}
return '';
}
?>
И в HTML:
php<a class="nav-link dropdown-toggle <?= menu_class('index', 'deals', 'search') ?>" ...
Так код станет проще и поддерживаемее.
Если хочешь, могу помочь переписать весь <nav>-блок с использованием этой функции.