2011-11-20 15 views
23

Co to jest równoważne z następujących (z siedzibą w stylu JS) w PHP:Korzystanie zwarcia dostać Pierwsza zmienna niezerowe

echo $post['story'] || $post['message'] || $post['name']; 

Więc jeśli historia istnieje wtedy zakładać, że; lub jeśli wiadomość istnieje po, że, etc ...

+1

jaki jest sens w takim operatorem?Nie wiesz, jaką konkretną zmienną chcesz wydrukować? –

+1

Dla tylko 2 argumentów możesz użyć: 'echo isset ($ _ POST ['story'])? $ _POST ['story']: $ _POST ['message']; ', w końcu spróbuj go zagnieździć. – mj82

+1

Jest oparty na strumieniu facebook api; tylko jeden/dwa z trzech będzie istniało na pocztę. –

Odpowiedz

37

Byłoby (PHP 5.3+):

echo $post['story'] ?: $post['message'] ?: $post['name']; 

I PHP 7:

echo $post['story'] ?? $post['message'] ?? $post['name']; 
+3

Bingo, to jest właściwa droga, aby to zrobić z 5.3 –

+0

Najładniejsze rozwiązanie, thx ... Nie wiedział w ten sposób ;-) – algorhythm

+1

To wygeneruje ostrzeżenie dla zmiennych, które nie są ustawione – billyonecan

6

Ponieważ zarówno or, jak i || nie zwracają jednego z ich argumentów, co nie jest możliwe.

można napisać prostą funkcję do niej choć:

function firstset() { 
    $args = func_get_args(); 
    foreach($args as $arg) { 
     if($arg) return $arg; 
    } 
    return $args[-1]; 
} 
+0

Tak, pomyślałem, że to będzie mój sposób, miałem nadzieję, że był jeszcze krótszy sposób wykonania. –

+1

Najprostszym sposobem byłoby przełączanie np. do Pythona: p – ThiefMaster

+0

Myślę, że przekazanie nieistniejącego var do tej funkcji spowoduje błąd. – pie6k

16
Nie

jest jedna wkładka na to, ale nie jest to dokładnie krócej:

echo current(array_filter(array($post['story'], $post['message'], $post['name']))); 

array_filter wróci wam wszystkim nie- puste pozycje z listy alternatyw. I current właśnie dostaje pierwszy wpis z przefiltrowanej listy.

+0

To jest idealne; Powiedziałbym, że to prawie odpowiednik tego, czego szukałem. Dzięki Mario! –

+0

+1 dla jedno-liniowych –

+1

Runtimewise, to kończy się wyliczanie wszystkich wartości, null lub nie, prawda? Przykład JS zatrzymałby się przy pierwszej niepustej wartości. –

1

Ta składnia ma wartość 1, jeśli któraś z nich jest ustawiona, a nie fałsz, a 0, jeśli nie.

Oto sposób jedna linia robi ten, który działa i który może być rozszerzony dla dowolnej liczby opcji:

echo isset($post['story']) ? $post['story'] : isset($post['message']) ? $post['message'] : $post['name']; 

... choć dość brzydki. Edycja: Mario's jest lepsze niż moje, ponieważ respektuje wybraną przez ciebie dowolną kolejność, ale w przeciwieństwie do tego, nie jest coraz brzydsza przy każdej dodawanej nowej opcji.

+0

Ale twoja opcja uwzględnia brakujący klucz skojarzeniowy, który w przeciwnym razie wygenerowałby błąd php. – Manatax

1

możesz spróbować

<?php 
    echo array_shift(array_values(array_filter($post))); 
?> 
1

Ponieważ różnorodność jest przyprawą życia:

echo key(array_intersect(array_flip($post), array('story', 'message', 'name'))); 
4

Od PHP 7, można użyć null coalescing operator:

Operator zerowy koalescencyjny (??) został dodany jako cukier składniowej dla wspólnego razie potrzeby użyć potrójnego w połączeniu z isset(). Zwraca pierwszy operand, jeśli istnieje i nie ma wartości NULL; w przeciwnym razie zwraca drugi operand.

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
+0

Teraz musimy tylko poczekać na repozytorium produkcyjne PHP 7, super podekscytowani, aby z niego skorzystać. –

+0

Nie zadziałałoby to w przypadku zadawanego pytania, chyba że nie wszystkie pola istnieją, ponieważ nie będą traktować ciągów zerowych (zwracanych, jeśli pole jest puste) jako NULL. –

Powiązane problemy