оператор if в середине конкатенации?

Это не работает? или я просто делаю это неправильно? Пробовал несколько вариантов и не нашел достоверной информации по этому вопросу. Любые идеи?

    $given_id = 1;
while ($row = mysql_fetch_array($sql))
{
    if ($i < 10){
    $display = '<a href="' . $row['info'] . '" onMouseOver="' . if($row['type']=="battle"){ . 'showB' . } else { . 'showA'() . "><div class="' . $row['type'] . "_alert" . '" style="float:left; margin-left:-22px;" id="' . $given_id . '"></div></a>';

person VVV    schedule 26.10.2012    source источник
comment
зачем вообще писать такой нечитаемый код? Разместите код правильно, и вы, скорее всего, исправите ошибку в процессе. Начните с использования sprintf   -  person Gordon    schedule 26.10.2012
comment
Понятия не имею, почему этот вопрос был закрыт как имеющий какое-либо отношение к географии, времени или необычной ситуации. Идея тернарного оператора x?y:z используется обычно во многих ситуациях, и я нашел эту страницу, в основном, для того, чтобы узнать, предлагает ли PHP эту функцию. К счастью, эта страница все еще существовала (несмотря на то, что была закрыта) и смогла разрешить мой запрос.   -  person dvaey    schedule 03.10.2017


Ответы (4)


если является самостоятельным утверждением. Это как полное заявление. Таким образом, вы не можете использовать его между объединением строк или около того. Лучшим решением является использование сокращенного тернарного оператора

    (conditional expression)?(ouput if true):(output if false);

Это также можно использовать при объединении строк. Пример :

    $i = 1 ;
    $result = 'The given number is'.($i > 1 ? 'greater than one': 'less than one').'. So this is how we cuse ternary inside concatenation of strings';

Вы также можете использовать вложенный тернарный оператор:

    $i = 0 ;
    $j = 1 ;
    $k = 2 ;
    $result = 'Greater One is'. $i > $j ? ( $i > $k ? 'i' : 'k' ) : ( $j > $k ? 'j' :'k' ).'.';
person Sony Mathew    schedule 26.10.2012
comment
Я думаю, что читаемость этой последней строки примерно равна результату (1 > 2 ? ( 'x' > 'flowers' ? 0 : 3 ) : ( $j > 42 ? ceil(pi()) : $kittens = true ) -1) - person Mike; 02.08.2013
comment
-1; то, что вы ищете в своих первых нескольких предложениях, — это различие между утверждением и выражением, но вместо этого вы используете выдуманные термины самодостаточное утверждение и полное утверждение которые на самом деле не объясняют, почему конструкция if не может быть объединена в строку. - person Mark Amery; 25.03.2017
comment
Я не использовал это именно так, но проголосовал за то, что дал мне идею - person hocikto; 28.10.2018

if..else – это инструкция, и ее нельзя использовать внутри выражения. Вам нужен «тройной» оператор ?:: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary.

person deceze♦    schedule 26.10.2012
comment
Я чувствую, что только что выиграл в лотерею. - person VVV; 26.10.2012
comment
Тернарный оператор хорош, но он может сделать код менее читаемым. Используйте его там, где это имеет смысл, и если кто-то еще будет читать ваш код, вы можете вообще не использовать его. - person user428517; 26.10.2012
comment
@VVV Вы выиграли ссылку на руководство. Использовать его мудро. - person deceze♦; 26.10.2012
comment
Я тоже чувствую, что только что выиграл в лотерею ... спасибо за эту замечательную ссылку :) - person Learner; 15.03.2016

Используйте сокращенный оператор if с использованием тернарных операторов ?: -

$display = 'start ' . (($row['type']=="battle")? 'showB' : 'showA') . ' end ';

См. «Тернарные операторы» на http://php.net/manual/en/language.operators.comparison.php

person doublesharp    schedule 26.10.2012
comment
Тройка — это не сокращенное выражение if, это выражение. - person Mark Amery; 25.03.2017
comment
Преимущество этого заключается в том, что вы можете сэкономить время и ресурсы при сохранении строк в переменных, а затем объединять их с другими строками. Он идет с потоком существующей строки. - person Thanasis; 24.03.2019

if — это утверждение. Нельзя помещать операторы внутрь выражения.

$str = 'foo';
if (cond)
{
  $str .= 'bar';
};
$str .= 'baz';
person Ignacio Vazquez-Abrams    schedule 26.10.2012