Frage

Viele Programmiersprachen haben eine coalesce Funktion (gibt den ersten Nicht-NULL-Wert Beispiel ). PHP, leider im Jahr 2009 nicht.

Was wäre ein guter Weg, um eine in PHP zu implementieren, bis PHP selbst eine coalesce Funktion wird?

War es hilfreich?

Lösung

Es gibt einen neuen Operator in PHP 5.3, die tut dies: ?:

// A
echo 'A' ?: 'B';

// B
echo '' ?: 'B';

// B
echo false ?: 'B';

// B
echo null ?: 'B';

Quelle: http://www.php.net/ChangeLog-5. php # 5.3.0

Andere Tipps

PHP 7 eingeführt, um eine echte coalesce Operator :

echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'

Wenn der Wert vor dem ?? nicht existiert hat oder null wird der Wert nach der ?? genommen wird.

Die Verbesserung gegenüber dem erwähnten ?: Operator ist, dass der ?? auch nicht definiert Variablen behandelt, ohne ein E_NOTICE zu werfen.

erste Treffer für "php coalesce" auf Google.

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
      return $arg;
    }
  }
  return NULL;
}

http://drupial.com/content/php-coalesce

Ich mag das:? Operator. Leider ist es noch nicht auf meiner Produktionsumgebung implementiert. So verwende ich das Äquivalent dieser:

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}

Es ist erwähnenswert, dass aufgrund der PHP-Behandlung von uninitalised Variablen und Array-Indizes, jede Art von coalesce Funktion nur von begrenztem Nutzen ist. Ich würde gerne in der Lage sein, dies zu tun:

$id = coalesce($_GET['id'], $_SESSION['id'], null);

Aber dies wird in den meisten Fällen dazu führen, PHP mit einer E_NOTICE auf Fehler. Der einzig sichere Weg, um die Existenz einer Variablen zu testen, bevor es verwendet, ist es zu verwenden, um direkt in empty () oder isset (). Der ternäre Operator von Kevin vorgeschlagen ist die beste Option, wenn Sie wissen, dass alle Optionen in Ihrem coalesce sind dafür bekannt, initialisiert werden.

Stellen Sie sicher, dass Sie genau ermitteln, wie Sie diese Funktion wollen mit bestimmten Typen arbeiten. PHP verfügt über eine Vielzahl von Typ-Überprüfung oder ähnliche Funktionen, so stellen Sie sicher wissen, wie sie funktionieren. Dies ist ein Beispiel-Vergleich von is_null () und empty ()

$testData = array(
  'FALSE'   => FALSE
  ,'0'      => 0
  ,'"0"'    => "0"  
  ,'NULL'   => NULL
  ,'array()'=> array()
  ,'new stdClass()' => new stdClass()
  ,'$undef' => $undef
);

foreach ( $testData as $key => $var )
{
  echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
  echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not')  . " null<br>";
  echo '<hr>';
}

Wie Sie sehen können, empty () true zurück, für alle von ihnen, aber is_null () nur tut dies für 2 von ihnen.

Ich erweitere sich auf die Antwort geschrieben von Ethan Kent . Diese Antwort verwirft nicht-Null-Argumente, die durch das Innenleben von array_filter , was nicht, was Funktion ein coalesce ist in der Regel der Fall ist. Zum Beispiel:

echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
  

Oops

Um dies zu überwinden, wird ein zweites Argument und Funktionsdefinition sind erforderlich. Die aufrufbar Funktion ist verantwortlich für das Erklären array_filter, ob das aktuelle Array Wert auf das Ergebnis-Array hinzuzufügen:

// "callable"
function not_null($i){
    return !is_null($i);  // strictly non-null, 'isset' possibly not as much
}

function coalesce(){
    // pass callable to array_filter
    return array_shift(array_filter(func_get_args(), 'not_null'));
}

Es wäre schön, wenn Sie einfach isset oder 'isset' als 2. Argument übergeben konnte array_filter, aber kein Glück.

Ich bin derzeit mit, aber ich frage mich, ob es nicht mit einigen der neuen Funktionen in PHP 5 verbessert werden könnte.

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
    return $arg;
    }
  }
  return $args[0];
}

PHP 5.3+, mit Schließungen:

function coalesce()
{
    return array_shift(array_filter(func_get_args(), function ($value) {
        return !is_null($value);
    }));
}

Demo: https://eval.in/187365

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top