2012-10-26 17 views
9

Czy to nie działa? czy robię to źle? Próbowałem wielu odmian i nie można znaleźć żadnych solidnych informacji na ten temat. jakieś pomysły?Instrukcja w środku konkatenacji?

$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>'; 
+0

dlaczego chcesz napisać nieczytelny kod jak to tak? Ułóż poprawnie kod i najprawdopodobniej naprawisz błąd w procesie. Zacznij od używania 'sprintf' – Gordon

+0

Nie masz pojęcia, dlaczego to pytanie zostało zamknięte jako mające związek z geografią, czasem lub niecodzienną sytuacją. Idea potrójnego operatora x? Y: z jest powszechnie używana, w wielu sytuacjach, i znalazłem tę stronę zasadniczo szukając, czy PHP oferuje tę funkcję. Na szczęście ta strona wciąż istniała (pomimo zamknięcia) i była w stanie rozwiązać moje zapytanie. – dvaey

Odpowiedz

26

jeśli jest samodzielnym stwierdzeniem. To jest jak pełne oświadczenie. Więc nie można go używać między konkatenencjami ciągów lub tak. Lepszym rozwiązaniem jest użycie skróconą trójskładnikowej operatior

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

ten może być stosowany w łączenie łańcuchów również. Przykład:

$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'; 

Można używać zagnieżdżonych trójskładnikowych operatora także:

$i = 0 ; 
    $j = 1 ; 
    $k = 2 ; 
    $result = 'Greater One is'. $i > $j ? ($i > $k ? 'i' : 'k') : ($j > $k ? 'j' :'k').'.'; 
+4

Myślę, że czytelność tej ostatniej linii jest w przybliżeniu równa wynikowi '(1> 2? (" X ">" kwiaty "? 0: 3): ($ j> 42? Ceil (pi()): $ kocięta = true) -1) ' – Mike

+0

-1; to, na co w pierwszych kilku zdań się powołujesz, to rozróżnienie między * wyrażeniem * a * wyrażeniem *, ale zamiast tego używasz sformułowanych terminów "samodzielna wypowiedź" i "pełna wypowiedź", które tak naprawdę nie wyjaśniają dlaczego konstrukt 'if' nie może zostać połączony z łańcuchem znaków. –

6

if..else jest oświadczenie i nie może być używany wewnątrz ekspresji. To, czego chcesz, to "trójkowy" operator: ?:: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary.

+1

Czuję, że właśnie wygrałem na loterii. – VVV

+0

Operator trójskładnikowy jest niezły, ale może sprawić, że kod będzie mniej czytelny. Użyj go tam, gdzie ma to sens, a jeśli ktoś inny będzie czytał twój kod, możesz rozważyć jego nieużywanie. – sgroves

+7

@VVV Wygrałeś link do instrukcji. Użyj tego z głową. – deceze

1

if to stwierdzenie. Nie można umieszczać instrukcji wewnątrz wyrażenia.

$str = 'foo'; 
if (cond) 
{ 
    $str .= 'bar'; 
}; 
$str .= 'baz';