оператор if в средата на конкатенацията? [затворено]

Това не работи ли? или просто го правя погрешно? Изпробвах множество негови варианти и изглежда не мога да намеря солидна информация по темата. някакви идеи?

    $given_id = 1;
while ($row = mysql_fetch_array($sql))
{
    if ($i < 10){
    $display = '<a href="/bg' . $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)


if е самостоятелно изявление. Това е нещо като пълно изявление. Така че не можете да го използвате между свързването на низове или така. По-доброто решение е да използвате съкратената троична операция

    (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