Na podstawie przykładów z tej strony poniżej mam działające i niedziałające próbki kodu.
Kod roboczy przy użyciu if
instrukcji:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
Niedziałający kod wykorzystujący operator trójskładnikowy:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
AKTUALIZACJA
Po wskazówce Briana stwierdziłem, że echo $test
daje oczekiwany rezultat. Poniższe działa jak urok!
echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
Odpowiedzi:
Plik
składnia nie jest operatorem „skrótu, jeśli” (
?
nazywany jest operatorem warunkowym), ponieważ nie możesz wykonać kodu w taki sam sposób, jak gdybyś:W twoim przykładzie wykonujesz
echo
instrukcję, gdy$address
nie jest pusta. Nie możesz tego zrobić w ten sam sposób z operatorem warunkowym. To, co możesz jednak zrobić, jestecho
wynikiem działania operatora warunkowego:a to wyświetli komunikat „Ulica jest pusta!” jeśli jest pusty, w przeciwnym razie wyświetli adres street2.
źródło
condition ?: false
co ocenia się,condition
jeśli jest to prawda?PHP 7+
Począwszy od PHP 7, to zadanie można wykonać po prostu za pomocą operatora koalescencji zerowej w następujący sposób:
echo !empty($address['street2']) ?? 'Empty';
źródło
$address['street2']
to pusty ciąg. Zaakceptuje to i nie wróci'Empty'
.isset() != empty()
. To zadziała tylko wtedy, gdy wartość tonull
$address['street2']
nie jest pusty?echo $address['street2'] ?? 'Empty';
jednak, jak wspomniano, jest to „ operator koalescencji zerowej ”, więc sprawdza tylko wartość null, a nie pustą. To dlatego, że ?? W rzeczywistości jest skrótem dla isset ().Podstawowa deklaracja prawda / fałsz
Warunkowa wiadomość powitalna
Komunikat dotyczący elementów warunkowych
ref: https://davidwalsh.name/php-ternary-examples
źródło
)
Jest niesłuszna. Powinien poprzedzać?
. Kompletne oświadczenie powinno być$is_admin = ($user['permissions'] == 'admin') ? true : false;
Operator trójskładnikowy jest po prostu skrótem dla bloku i if / else. Twój działający kod nie ma innego warunku, więc nie nadaje się do tego.
Poniższy przykład zadziała:
źródło
To operator trójargumentowy aka operator Elvisa (google it: P), którego szukasz.
Zwraca wartość zmiennej lub wartość domyślną, jeśli zmienna jest pusta.
źródło
Zwróć uwagę, że używając zagnieżdżonych operatorów warunkowych, możesz chcieć użyć nawiasów, aby uniknąć możliwych problemów!
Wygląda na to, że PHP nie działa tak samo, jak przynajmniej JavaScript lub C #.
Ten sam kod w JavaScript i C # zwraca „Wyjątkowe” w obu przypadkach.
W drugim przypadku to, co robi PHP (a przynajmniej to rozumiem):
$score > 10
? tak$age > 10
? nie, więc bieżący$age > 10 ? 'Average' : 'Exceptional'
zwraca „Wyjątkowy”'Exceptional' ? 'Horrible' : 'Average'
zwraca „Straszne”, ponieważ „Wyjątkowe” jest prawdziweZ dokumentacji: http://php.net/manual/en/language.operators.comparison.php
źródło
Szybka i krótka droga:
Oto kilka interesujących przykładów z jednym lub kilkoma różnymi warunkami.
źródło
Warunkowa wiadomość powitalna
Zagnieżdżony skrót PHP
źródło
Można to zrobić nawet krócej, zastępując
echo
z<?= code ?>
<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>
Jest to przydatne zwłaszcza, gdy chcesz określić w pasku nawigacyjnym, czy opcja menu ma być wyświetlana jako już odwiedzona (kliknięta), czy nie:
<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>
źródło
Myślę, że użyłeś nawiasów w niewłaściwy sposób. Spróbuj tego:
Myślę, że powinno działać, możesz też użyć:
źródło
Myślę, że prawdopodobnie nie powinieneś używać operatora trójskładnikowego w php. Rozważ następny przykład:
Jak myślisz, jaka
$a
zmienna będzie zawierać? (wskazówka: dos) I pozostanie bez zmian, nawet jeśli$foo
zmienna zostanie przypisana do 2.Aby było lepiej, należy odmówić użycia tego operatora lub otoczyć prawą część nawiasami klamrowymi w następujący sposób:
źródło
Operator trójargumentowy jest w zasadzie skrótem dla instrukcji if / else. Możemy użyć, aby zmniejszyć kilka wierszy kodu i zwiększyć czytelność.
Twój kod wydaje mi się czystszy. Ale możemy dodać bardziej przejrzysty sposób w następujący sposób:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
Inny sposób-
$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');
Uwaga - dodałem nawias do całego wyrażenia, aby było bardziej przejrzyste. Zwykle robiłem to, aby zwiększyć czytelność. Z PHP7 możemy użyć Null Coalescing Operator / php 7 ?? operator za lepsze podejście. Ale twoje wymaganie nie pasuje.
źródło
Istnieje również skrótowy operator trójskładnikowy i wygląda to tak:
(wyrażenie1)?: wyrażenie2 zwróci wyrażenie1, jeśli zwróci wartość true lub wyrażenie2 w przeciwnym razie.
Przykład:
wróci
Z podręcznika PHP
źródło