Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение ksetrin »

Есть такая интересная конструкция в base template yii2

Код: Выделить всё

            echo Nav::widget([
                'options' => ['class' => 'navbar-nav navbar-right'],
                'items' => [
                    ['label' => 'Home', 'url' => ['/site/index']],
                    ['label' => 'About', 'url' => ['/site/about']],
                    ['label' => 'Contact', 'url' => ['/site/contact']],
                    Yii::$app->user->isGuest ?
                        ['label' => 'Login', 'url' => ['/site/login']] :
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                            'url' => ['/site/logout'],
                            'linkOptions' => ['data-method' => 'post']],
                ],
            ]); 
Где интересен вот этот момент

Код: Выделить всё

                    Yii::$app->user->isGuest ?
                        ['label' => 'Login', 'url' => ['/site/login']] :
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                            'url' => ['/site/logout'],
                            'linkOptions' => ['data-method' => 'post']],
 
Так вот, я хочу переписать эту конструкцию на

Код: Выделить всё

if (true)
                        return ['label' => 'Login', 'url' => ['/site/login']],
 
но всякий раз ныкаюсь на syntax error, unexpected 'if' (T_IF), expecting ']'
Дело в том, что мне нужно в виджете вставлять колонку, только если выполняется некоторое условие, иначе ничего не делать.
Знаю, можно сделать отдельно массив колонок и потом добавить. Но вопрос не об этом. Вопрос о том, как преобразовать тернарный оператор в if () ... если такое возможно вообще? А если нет, то подскажите, почему тернарный оператор работает между массивами (я чет не понимаю)?
Аватара пользователя
PaSiS
Сообщения: 88
Зарегистрирован: 2011.11.15, 18:07
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение PaSiS »

Довольно странный вопрос, ну да ладно, вот не менее странное решение :)
при инициализации виджета, создаете массив $items, затем идет ваше условие в котором формируется массив $items2, а затем в сам виджет передаете array_merge этих массивов
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение ksetrin »

PaSiS писал(а):Довольно странный вопрос, ну да ладно, вот не менее странное решение :)
при инициализации виджета, создаете массив $items, затем идет ваше условие в котором формируется массив $items2, а затем в сам виджет передаете array_merge этих массивов
Возможно вы не дочитали вот эту часть вопроса
Знаю, можно сделать отдельно массив колонок и потом добавить. Но вопрос не об этом. Вопрос а о том, как преобразовать тернарный оператор в if () ... если такое возможно вообще? А если нет, то подскажите, почему тернарный оператор работает между массивами (я чет не понимаю)?
Обходные пути понятны, но хочется понять, почему тернарный работает, и не работает if, и как сделать что бы работал if
Аватара пользователя
PaSiS
Сообщения: 88
Зарегистрирован: 2011.11.15, 18:07
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение PaSiS »

ksetrin писал(а):Обходные пути понятны, но хочется понять, почему тернарный работает, и не работает if, и как сделать что бы работал if
IF туда вставить не получится, так как это управляющая конструкция, а тернарный оператор, в свою очередь, является "выражением" (как, если бы вы написали $arr[] = (2 * 2);
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение Neuromance »

ksetrin писал(а):
PaSiS писал(а):Довольно странный вопрос, ну да ладно, вот не менее странное решение :)
при инициализации виджета, создаете массив $items, затем идет ваше условие в котором формируется массив $items2, а затем в сам виджет передаете array_merge этих массивов
Возможно вы не дочитали вот эту часть вопроса
Знаю, можно сделать отдельно массив колонок и потом добавить. Но вопрос не об этом. Вопрос а о том, как преобразовать тернарный оператор в if () ... если такое возможно вообще? А если нет, то подскажите, почему тернарный оператор работает между массивами (я чет не понимаю)?
Обходные пути понятны, но хочется понять, почему тернарный работает, и не работает if, и как сделать что бы работал if
А что вы с if-а то начали, вставляли бы прям в массив какой-нибудь foreach :lol:

Если if надо непонятно зачем вставлять прям в определение массива, то оберните его в функцию.

Код: Выделить всё

function(){
    if(){...}
}
 
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение ksetrin »

PaSiS писал(а):
ksetrin писал(а):Обходные пути понятны, но хочется понять, почему тернарный работает, и не работает if, и как сделать что бы работал if
IF туда вставить не получится, так как это управляющая конструкция, а тернарный оператор, в свою очередь, является "выражением" (как, если бы вы написали $arr[] = (2 * 2);
Благодарю за разъяснение
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение ksetrin »

А что вы с if-а то начали, вставляли бы прям в массив какой-нибудь foreach :lol:

Если if надо непонятно зачем вставлять прям в определение массива, то оберните его в функцию.

Код: Выделить всё

function(){
    if(){...}
}
 
Это как вставлять прямо в массив какой-нибудь foreach? Пример можно? и с функцией примерчик?
Вы уверены что это будет работать?

Код: Выделить всё

$gg = ["asd","asdc"];

            echo Nav::widget([
                'options' => ['class' => 'navbar-nav navbar-right'],
                'items' => [
                    ['label' => 'Home', 'url' => ['/site/index']],
                    ['label' => 'About', 'url' => ['/site/about']],
                    foreach ($gg as $g) echo $g; //Вы это имели ввиду?
                    function(){ // надо непонятно зачем вставлять прям в определение массива (в массив 'items' должны попасть только кошерные элементы)
            if(true){
                return $gg[0];
            }
            }
                    ['label' => 'Contact', 'url' => ['/site/contact']],
                    Yii::$app->user->isGuest ?
                        ['label' => 'Login', 'url' => ['/site/login']] :
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                            'url' => ['/site/logout'],
                            'linkOptions' => ['data-method' => 'post']],
                ],
            ]); 
Последний раз редактировалось ksetrin 2015.05.24, 10:00, всего редактировалось 1 раз.
Аватара пользователя
PaSiS
Сообщения: 88
Зарегистрирован: 2011.11.15, 18:07
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение PaSiS »

ksetrin писал(а):с функцией примерчик?
Про foreach не стану ничего писать :)
пример с функцией:

Код: Выделить всё

$items = [
    ['col1'] => true,
    ['col2'] => false,
    ['col3'] => function() {
        return 1 === 1; //true
    },
    ['col4'] => 'string',
]; 
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение ElisDN »

Используйте тернарный оператор совместно с array_filter:

Код: Выделить всё

'items' => array_filter([
    ['label' => 'Home', 'url' => ['/site/index']],
    ['label' => 'About', 'url' => ['/site/about']],
    ['label' => 'Contact', 'url' => ['/site/contact']],
    1===1 ? ['label' => 'Login', 'url' => ['/site/login']] : false,
    ['label' => 'Contact', 'url' => ['/site/contact']],
]),
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение mkramer »

ksetrin, ваш вопрос показывает, что вы язык не знаете. foreach - это вам с сарказмом сказали, его туда тоже вставлять нельзя. Туда можно вставлять только операции. Тернарный оператор - это не if.
Аватара пользователя
ksetrin
Сообщения: 81
Зарегистрирован: 2015.03.06, 10:00
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение ksetrin »

mkramer писал(а):ksetrin, ваш вопрос показывает, что вы язык не знаете. foreach - это вам с сарказмом сказали, его туда тоже вставлять нельзя. Туда можно вставлять только операции. Тернарный оператор - это не if.
Все верно, я новичок, как и многие на этом форуме. Заявлений, что я профи или эксперт тут не было. Что я могу ответить вам:
mkramer писал(а):ksetrin, ваш вопрос показывает, что вы язык не знаете.
Спасибо, капитан
mkramer писал(а):foreach - это вам с сарказмом сказали, его туда тоже вставлять нельзя. Туда можно вставлять только операции.
Спасибо, капитан
mkramer писал(а):Тернарный оператор - это не if.
Огромное спасибо, капитан

Давайте по существу, без повторений
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение mkramer »

По существую,

Код: Выделить всё

  Yii::$app->user->isGuest || 1 ?
                        ['label' => 'Login', 'url' => ['/site/login']] :
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                            'url' => ['/site/logout'],
                            'linkOptions' => ['data-method' => 'post']],
 
Если я правильно понял, зачем ваше if (true). Я как-то не ожидал увидеть на форуме по крутому фреймворку людей, которые в основах php плавают.
arlamar
Сообщения: 39
Зарегистрирован: 2013.07.20, 17:38

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение arlamar »

ksetrin писал(а):
mkramer писал(а):ksetrin, ваш вопрос показывает, что вы язык не знаете. foreach - это вам с сарказмом сказали, его туда тоже вставлять нельзя. Туда можно вставлять только операции. Тернарный оператор - это не if.
Все верно, я новичок, как и многие на этом форуме. Заявлений, что я профи или эксперт тут не было.
Да не было, но зачем писать вопрос по основам в ветку "Общие вопросы (Yii 2.x)" и после того как вам уже всё объяснили, в принципе, писать :
ksetrin писал(а):Давайте по существу, без повторений
mkramer писал(а):По существую,

Код: Выделить всё

  Yii::$app->user->isGuest || 1 ?
                        ['label' => 'Login', 'url' => ['/site/login']] :
                        ['label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                            'url' => ['/site/logout'],
                            'linkOptions' => ['data-method' => 'post']],
 
Если я правильно понял, зачем ваше if (true). Я как-то не ожидал увидеть на форуме по крутому фреймворку людей, которые в основах php плавают.
Вы серьёзно? Yii::$app->user->isGuest || 1 - вот это тоже "заплывчик")
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение mkramer »

Серьёзно. КОнструкции с if (true) или if (false) я обычно расставляю по коду, чтобы что-то убрать временно, но не удалять из кода. Посему я решил, что у ТС такая же задача, и дал ему аналог. Здесь тоже будет всегда ['label' => 'Login', 'url' => ['/site/login']], как и с его if (true), а потом можно будет 1 удалить, и вернуть второй вариант
Аватара пользователя
PaSiS
Сообщения: 88
Зарегистрирован: 2011.11.15, 18:07
Контактная информация:

Re: Преобразование тернарного оператора в конструкцию if (на примере Nav::widget)

Сообщение PaSiS »

mkramer писал(а):КОнструкции с if (true) или if (false) я обычно расставляю по коду, чтобы что-то убрать временно, но не удалять из кода
А не практичнее использовать комментирование?
Ответить