Verwenden von Kurzschlüssen, um die erste Nicht-Null-Variable zu erhalten

Lesezeit: 4 Minuten

Benutzer-Avatar
MKN-Weblösungen

Was ist das Äquivalent zu Folgendem (basierend auf JS-Stil) in PHP:

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

Also, wenn es eine Geschichte gibt, dann poste das; oder wenn eine Nachricht vorhanden ist, poste das, etc …

  • Was ist der Sinn eines solchen Operators? Wissen Sie nicht, welche bestimmte Variable Sie ausgeben möchten?

    – Ihr gesunder Menschenverstand

    20. November 2011 um 18:51 Uhr

  • Für nur 2 Argumente können Sie verwenden: echo isset($_POST['story']) ? $_POST['story'] : $_POST['message'];versuchen Sie schließlich, es zu verschachteln.

    – mj82

    20. November 2011 um 18:52 Uhr


  • Es basiert auf dem Facebook-API-Stream; nur ein/zwei von drei werden pro Post existieren.

    – MKN Weblösungen

    20. November 2011 um 18:52 Uhr

Benutzer-Avatar
Adam Pietrasiak

Es wäre (PHP 5.3+):

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

Und für PHP7:

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

  • Dies erzeugt eine Warnung für Variablen, die nicht gesetzt sind

    – billyonecan

    26. Februar 2016 um 13:58 Uhr

  • Ich bin wirklich überrascht. Ich wusste all die Jahre nichts davon

    Benutzer2286243

    10. April 2018 um 8:43 Uhr

Benutzer-Avatar
Mario

Dafür gibt es einen Einzeiler, der aber nicht gerade kürzer ist:

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

array_filter würde Ihnen alle Nicht-Null-Einträge aus der Liste der Alternativen zurückgeben. Und current erhält nur den ersten Eintrag aus der gefilterten Liste.

  • Dies ist perfekt; Ich würde sagen, das ist das Äquivalent zu dem, was ich gesucht habe. Danke mario!

    – MKN Weblösungen

    20. November 2011 um 18:53 Uhr


  • Laufzeitmäßig wird dies dazu führen, dass alle Werte aufgezählt werden, ob null oder nicht, richtig? Das JS-Beispiel hätte beim ersten Nicht-Null-Wert angehalten.

    – Tom Lianza

    11. September 2012 um 0:36 Uhr

  • @pinouchon Bei allem Respekt, das ist überhaupt nicht schwer zu lesen. Obwohl mir die Antwort von Kluska000 besser gefällt.

    – ankr

    13. Mai 2014 um 14:54 Uhr


  • array_filter gibt alle Nicht-Null-Einträge aus dem Array zurück, nicht nur den ersten.

    – Nett

    16. März 2017 um 15:05 Uhr

  • @Neets Deshalb die current() wickelt es ein.

    – mario

    16. März 2017 um 15:47 Uhr

Da beide or und || einen ihrer Operanden nicht zurückgeben, das ist nicht möglich.

Dafür könnte man aber eine einfache Funktion schreiben:

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

  • Ja, ich dachte, das wäre mein anderer Weg, ich hatte gehofft, dass es einen noch kürzeren Weg der Ausführung gibt.

    – MKN Weblösungen

    20. November 2011 um 18:49 Uhr

  • Am einfachsten wäre es zB auf python umzusteigen :p

    – Meister der Diebe

    20. November 2011 um 18:50 Uhr

  • Ich denke, das Übergeben einer nicht vorhandenen var an diese Funktion würde einen Fehler verursachen.

    – Adam Pietrasiak

    15. Oktober 2015 um 13:45 Uhr

  • @AdamPietrasiak – Das dachte ich auch, aber ich habe es gerade getestet und es beschwert sich nicht. Obwohl ich es nicht “firstset” nennen würde, sondern vielleicht “firsttrue”.

    – TextGeek

    2. September 2016 um 16:29 Uhr

Ab PHP 7 können Sie die Null-Koaleszenzoperator:

Der Null-Coalescing-Operator (??) wurde als syntaktischer Zucker für den häufigen Fall hinzugefügt, dass ein Ternär in Verbindung mit isset() verwendet werden muss. Es gibt seinen ersten Operanden zurück, falls er existiert und nicht NULL ist; andernfalls gibt es seinen zweiten Operanden zurück.

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

Aufbauend auf Adams Antwort könnten Sie den Fehlerkontrolloperator verwenden, um die Fehler zu unterdrücken, die generiert werden, wenn die Variablen nicht gesetzt sind.

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

http://php.net/manual/en/language.operators.errorcontrol.php

Du kannst es versuchen

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

Diese Syntax würde 1 ausgeben, wenn eines davon gesetzt und nicht falsch ist, und 0, wenn nicht.

Hier ist eine einzeilige Methode, die funktioniert und die für eine beliebige Anzahl von Optionen erweitert werden kann:

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

… aber ziemlich hässlich. Bearbeiten: Marios ist besser als meine, da es Ihre gewählte willkürliche Reihenfolge so respektiert, aber im Gegensatz zu dieser wird es nicht mit jeder neuen Option, die Sie hinzufügen, hässlicher.

  • Ihre Option berücksichtigt jedoch den fehlenden assoziativen Schlüssel, der andernfalls einen PHP-Fehler generieren würde.

    – Manatax

    2. Januar 2014 um 0:58 Uhr

1048010cookie-checkVerwenden von Kurzschlüssen, um die erste Nicht-Null-Variable zu erhalten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy