Fonction Coalesce pour PHP?

de nombreux langages de programmation ont une fonction coalesce (renvoie la première valeur non nulle, exemple ). PHP, malheureusement en 2009, ne l'est pas.

quelle serait une bonne façon d'en implémenter une en PHP jusqu'à ce que PHP obtienne lui-même une fonction coalesce?

121
demandé sur hakre 2009-06-18 19:49:14

9 réponses

il y a un nouvel opérateur en php 5.3 qui fait ceci: ?:

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

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

// B
echo false ?: 'B';

// B
echo null ?: 'B';

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

176
répondu Kevin 2009-12-12 01:32:16

PHP 7 introduit un véritable coalesce opérateur :

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

Si la valeur avant de la ?? n'existe pas ou est null la valeur après le ?? .

l'amélioration par rapport à l'opérateur mentionné ?: est, que le ?? gère également des variables non définies sans lancer un E_NOTICE .

57
répondu flori 2015-11-28 20:15:39

premier succès pour "PHP coalesce" sur google.

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

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

28
répondu Will Shaver 2009-06-18 15:51:34

j'aime vraiment le ?: opérateur. Malheureusement, il n'est pas encore appliqué sur mon environnement de production. Donc j'utilise l'équivalent de ceci:

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}
17
répondu Ethan Kent 2011-01-14 04:58:25

il est intéressant de noter qu'en raison du traitement par PHP des variables non initialisées et des indices de tableaux, tout type de fonction coalesce est d'utilisation limitée. J'aimerais être capable de faire cela:

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

mais cela causera, dans la plupart des cas, une erreur de PHP avec un E_NOTICE. La seule façon de tester l'existence d'une variable avant de l'utiliser est de l'utiliser directement dans le vide() ou la fonction isset(). L'opérateur ternaire suggéré par Kevin est la meilleure option si vous savez que tous les options dans votre coalesce sont connues pour être initialisées.

9
répondu Andrew 2013-04-09 15:14:16

assurez-vous d'identifier exactement comment vous voulez que cette fonction fonctionne avec certains types. PHP a une grande variété de type-vérification ou des fonctions similaires, donc assurez-vous que vous savez comment ils fonctionnent. Il s'agit d'un exemple de comparaison entre is_null () et 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>';
}

comme vous pouvez le voir, empty() retourne true pour tous ces derniers, mais is_null() ne le fait que pour 2 d'entre eux.

6
répondu Peter Bailey 2009-06-18 16:43:18

je suis l'expansion de la réponse publiée par Ethan Kent . Cette réponse rejettera les arguments non-nuls qui évaluent à false en raison du fonctionnement interne de array_filter , ce qui n'est pas ce que fait habituellement une fonction coalesce . Par exemple:

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

Oups

pour surmonter cela, un deuxième argument et une définition de la fonction sont nécessaires. Le callable fonction est responsable de dire array_filter si oui ou non ajouter la valeur du tableau courant au tableau résultat:

// "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'));
}

Ce serait bien si vous pouviez simplement passer isset ou 'isset' pour la 2ème argument array_filter , mais pas de chance.

1
répondu Madbreaks 2018-04-22 11:23:09

Je l'utilise actuellement, mais je me demande s'il ne pourrait pas être amélioré avec certaines des nouvelles fonctionnalités de PHP 5.

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
    return $arg;
    }
  }
  return $args[0];
}
0
répondu mikl 2009-06-18 15:54:44

PHP 5.3+, avec fermetures:

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

Démo: https://eval.in/187365

0
répondu Paulo Freitas 2014-09-02 20:21:54