Wenn null, verwenden Sie eine andere Variable in einer Zeile in PHP

70

Gibt es in PHP etwas Ähnliches wie in JavaScript:

alert(test || 'Hello');

Wenn der Test undefiniert oder null ist, wird Hallo angezeigt, andernfalls wird der Wert von test angezeigt.

Ich habe eine ähnliche Syntax in PHP ausprobiert, aber es scheint nicht richtig zu funktionieren ... Außerdem habe ich keine Ahnung, wie ich dieses Problem googeln soll.

Vielen Dank

Bearbeiten

Ich sollte wahrscheinlich hinzufügen, dass ich es in einem Array verwenden wollte:

$arr = array($one || 'one?', $two || 'two?'); //This is wrong

Aber in der Tat kann ich die Inline verwenden? : 'if Aussage auch hier, danke.

$arr = array(is_null($one) ? "one?" : $one, is_null($two) ? "two ?" : $two); //OK
Rochal
quelle
Wenn Sie ein Array mit mehr als 3 Elementen wie diesem erstellen möchten, schauen Sie sich meine Antwort an, um sich viele ternäre Operatoren zu ersparen;)
Felix Kling
Nun

Antworten:

50

In der Antwort von @ Yamiko unten finden Sie eine PHP7-Lösung unter https://stackoverflow.com/a/29217577/140413

 echo (!$test) ? 'hello' : $test;

Oder Sie können etwas robuster sein und dies tun

echo isset($test) ? $test : 'hello'; 
Jeff Busby
quelle
3
Warum gegen! $ Test prüfen und nicht nur $ test machen? $ test: 'hallo'; stattdessen?
AndrewKS
4
Nun, er gab an, wenn $ test undefiniert oder null war, wollte er 'Hallo' sehen, wenn der Wert von $ test int (0) war, würde er immer noch Hallo sehen, obwohl es gesetzt und nicht null ist, weil php 0 als falsch interpretiert, es sei denn, Sie verwenden ===. Um sicher zu gehen, sollte er überprüfen, ob $ test gesetzt und nicht null ist. Zumindest war das meine Logik.
Jeff Busby
Ich verstehe, aber Ihre Auflösung ist sehr verwirrend :(. Es sollte keine akzeptierte Antwort gemäß "Wenn null, verwenden Sie eine andere Variable in einer Zeile in PHP" sein. Die Antwort von @yamiko ist sehr einfach und nützlich.l
Santi
Das || is_null()ist hier redundant, isset($var)gibt false zurück, wenn $vares null ist
Arth
62

du kannst tun echo $test ?: 'hello';

Dies wird wiedergegeben, $testwenn es wahr ist und 'hello'anders.

Beachten Sie, dass ein Hinweis oder ein strikter Fehler ausgegeben $testwird, wenn nicht festgelegt, aber ...

Dies sollte kein Problem sein, da die meisten Server diese Fehler ignorieren. Die meisten Frameworks verfügen über Code, der diese Fehler auslöst.


Bearbeiten: Dies ist ein klassischer ternärer Operator , bei dem jedoch der mittlere Teil weggelassen wurde. Verfügbar seit PHP 5.3.

echo $test ? $test : 'hello'; // this is the same
echo $test ?: 'hello';        // as this one

Dies prüft nur die Richtigkeit der ersten Variablen und nicht, wenn sie undefiniert ist. In diesem Fall wird der E_NOTICEFehler ausgelöst. Überprüfen Sie für letzteres die PHP7-Antwort unten (hoffentlich bald oben).

Yamiko
quelle
1
Ich bin damit einverstanden, aber wichtige Bibliotheken und Plugins für sie lösen sie ständig aus, sodass sie in der Produktion normalerweise ignoriert werden. Diese Art von Fehler ist auch E_NOTICE, was sicher ignoriert werden kann. Ich persönlich mag es nicht, Fehler auszulösen, einschließlich E_NOTICE, aber bei dieser Art von Fehlern geht es mehr um Best Practices als um einen tatsächlichen Fehler, der behoben werden muss
Yamiko
Ich weiß auch, dass eine vorzeitige Optimierung schlecht ist und das Auslösen eines Hinweises dazu führt, dass die Fehlerbehandlungsfunktion (ob PHPs Standard oder eine benutzerdefinierte) aufgerufen wird, selbst wenn diese Funktion den Fehler aufgrund Ihrer Einstellung error_reporting ignoriert und dies langsam sein kann vor allem, wenn Sie es innerhalb einer Schleife tun.
Thomasrutter
Wie heißt das ?: Operator? Kann jemand auf die Dokumente verlinken?
Inafalcao
@inafalcao Es ist ein klassischer ternärer Operator , aber der Mittelteil wurde weggelassen . Es macht es also zu einem ternären Kurzoperator. Verfügbar seit PHP 5.3.
Dboris
1
Ordentlich, ich wusste nie davon. Man könnte sagen, es ?:ist so ?wie es +=ist =... irgendwie.
Agent Freitag,
58

Ab PHP 7 können Sie einen sogenannten Koaleszenzoperator verwenden, der genau das tut, was Sie wollen, ohne die E_NOTICE, die ausgelöst wird ?:.

Um es zu verwenden, verwenden Sie, um zu ??überprüfen, ob der Wert links gesetzt und nicht null ist.

$arr = array($one ?? 'one?', $two ?? 'two?'); 
Yamiko
quelle
5

Ich bin sehr überrascht, dass dies in den anderen Antworten nicht vorgeschlagen wird:

echo isset($test) ? $test : 'hello';

Von den Dokumenten isset($var) wird false zurückgegeben, wenn $vares nicht existiert oder auf null gesetzt ist .

Der von @Yamiko beschriebene Null-Koaleszenz-Operator ab PHP 7 ist eine Syntaxverknüpfung für die oben genannten.

In diesem Fall:

echo $test ?? 'hello'; 
Arth
quelle
5

Einzeiler. Super lesbar, funktioniert für reguläre Variablen, Arrays und Objekte.

// standard variable string
$result = @$var_str ?: "default";

// missing array element
$result = @$var_arr["missing"] ?: "default";

// missing object member
$result = @$var_obj->missing ?: "default";

Sehen Sie es in Aktion: Php Sandbox Demo

TrophyGeek
quelle
3

Verwenden Sie dies gemäß der neuesten Version für die Kurzform

$var = $value ?? "secondvalue";
Khalid Khan
quelle
Ja! Vielen Dank für diese Antwort. Scheint, dass der Null-Koaleszenz-Operator in PHP 7 hinzugefügt wurde. Php.net/manual/en/…
phip
1

Wenn Sie auf diese Weise ein Array erstellen möchten, array_mapbietet dies eine präzisere Möglichkeit (abhängig von der Anzahl der Elemente im Array):

function defined_map($value, $default) {
    return (!isset($value) || is_null($value)) ? $default : $value;
    // or return $value ? $default : $value;
}

$values = array($one, $two);
$defaults = array('one', 'two');

$values = array_map('defined_map', $values, $defaults);

Stellen Sie einfach sicher, dass Sie wissen, welche Elemente bewertet werden,false damit Sie den richtigen Test anwenden können.

Felix Kling
quelle
0

Es mag einen besseren Weg geben, aber dies ist das erste, was mir in den Sinn kam:

 echo (!$test) ? "Hello" : $test;
Sean Walsh
quelle
0

Null ist in PHP falsch, daher können Sie ternär verwenden:

alert($test ? $test : 'Hello');

Bearbeiten:

Dies gilt auch für eine leere Zeichenfolge, da ternary die Gleichheit '===' anstelle von '==' verwendet.

Eine leere oder Nullzeichenfolge ist falsch, unabhängig davon, ob der Operator '===' oder '==' verwendet wird. Ich sollte wirklich zuerst meine Antworten testen.

AndrewKS
quelle
0

Wenn Sie die von Ihnen angegebene Notation erweitern, haben Sie Folgendes:

if (test) {
    alert(test);
} else {
    alert('Hello');
}

Es ist also nur ein einfaches if ... else-Konstrukt. In PHP können Sie einfach verkürzen, wenn ... sonst als so genannter 'ternärer Ausdruck' konstruiert wird:

alert($test ? $test : 'Hello');

Offensichtlich gibt es alertin PHP kein Äquivalent zur JS- Funktion, aber das Konstrukt ist dasselbe.

Geoff Adams
quelle
-1
alert((test == null || test == undefined)?'hello':test);
Chris Pennycuick
quelle
-1

Ich hatte kürzlich das gleiche Problem. So habe ich es gelöst:

<?php if (empty($row['test'])) {
                    echo "Not Provided";} 
                        else {
                    echo $row['test'];}?></h5></span></span>
              </div>

Ihr Wert in der Datenbank befindet sich in der Variablen $ test. Wenn also die Zeile $ test leer ist, wird das Echo Nicht bereitgestellt

RileyManda
quelle