Задать вопрос
frost18
@frost18
Программист PHP

Можно ли в теле массива использовать условия для добавления элементов?

При вызове функции, особенно в шаблонах (виджеты, хелперы) приходится передавать параметры в виде массива, и я нахожу очень не удобным создавать новые переменные для того что бы наполнить их нужными параметрами по условию. Имеется ли в PHP возможно делать это более лаконичным способом? Для примера привел код как мне бы хотелось что бы было (у меня на php 5.4 не работает)
$x = true;
        
        $a = [
            'a' => 'test',
            'b' => 'test2',
            !empty($x) ? 'c' => 'test3' : '',
        ];
  • Вопрос задан
  • 2287 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
FanatPHP
@FanatPHP
Чебуратор тега РНР
Оставляя за скобками синтаксическую осмысленность этого кода, зададимся вопросом осмысленности результата
Зачем тебе массив вида
$a = [
    'a' => 'test',
    'b' => 'test2',
    '',
];

?

И кто мешает просто добавлять в массив элементы по условию?
$a = [
    'a' => 'test',
    'b' => 'test2',
];
!empty($x) ? $a['c'] => 'test3';
Ответ написан
Комментировать
ibnteo
@ibnteo
'c'=>!empty($x)?'test3':'',
Ответ написан
1. нет, так нельзя.
2. это отвратительно с точки зрения читабельности кода.
Ответ написан
Комментировать
frost18
@frost18 Автор вопроса
Программист PHP
Пример из жизни, используя Yii, добавляю ссылку
<?=CHtml::link('Удалить', '/files/123.jpg', ['class' => 'link', 'data-id' => 86])?>


Для того что бы добавить новый атрибут по условию мне нужно сделать так:
<?$htmlOptions = ['class' => 'link', 'data-id' => 86]?>

<?if($x === TRUE){
    $htmlOptions['data-module'] = 'file';
}?>

<?=CHtml::link('Удалить', '/files/123.jpg', $htmlOptions)?>


Но я считаю что не отвратительно было бы если бы я мог записать это так:
<?=CHtml::link('Удалить', '/files/123.jpg', ['class' => 'link', 'data-id' => 86, ($x === TRUE ? 'data-module' => 'file')])?>
Ответ написан
He11ion
@He11ion
PHP-monkey
isset($x) ? $a += ['c' => 'test3'] : '';
или
!isset($x) ?: $a += ['c' => 'test3'];

isset меняется на нужный логический оператор. Ну и "+" с массивами надо знать как работает.
Ответ написан
maximing
@maximing
$a = [
            'a' => 'test',
            'b' => 'test2',
            'c' => function($x) {
                 if(....)
                     return .....
             },
        ];
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы