Question

De nombreux langages de programmation ont une fonction coalesce (renvoie la première valeur non NULL, exemple ). PHP, malheureusement en 2009, ne le fait pas.

Quel serait un bon moyen d’implémenter un système en PHP jusqu’à ce que PHP ait lui-même une fonction de fusion?

Était-ce utile?

La solution

Il y a un nouvel opérateur dans 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

Autres conseils

PHP 7 a introduit un véritable Opérateur de fusion :

echo 

PHP 7 a introduit un véritable Opérateur de fusion :

<*>

Si la valeur précédant le ?? n'existe pas ou si null est la valeur après que le ?? soit pris.

L'amélioration par rapport à l'opérateur ?: mentionné réside dans le fait que le ?? gère également les variables non définies sans générer de E_NOTICE .

GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'

Si la valeur précédant le ?? n'existe pas ou si null est la valeur après que le ?? soit pris.

L'amélioration par rapport à l'opérateur ?: mentionné réside dans le fait que le ?? gère également les variables non définies sans générer de E_NOTICE .

Premier coup 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

J'aime beaucoup l'opérateur?:. Malheureusement, il n'est pas encore implémenté sur mon environnement de production. J'utilise donc l'équivalent de ceci:

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

Il convient de noter qu’en raison du traitement des variables non initiées et des index de tableaux par PHP, tout type de fonction de coalesce est d’une utilité limitée. J'aimerais pouvoir faire ceci:

$id = coalesce(

Il convient de noter qu’en raison du traitement des variables non initiées et des index de tableaux par PHP, tout type de fonction de coalesce est d’une utilité limitée. J'aimerais pouvoir faire ceci:

<*>

Mais dans la plupart des cas, cela provoquera une erreur de PHP avec un E_NOTICE. Le seul moyen sûr de tester l’existence d’une variable avant de l’utiliser est de l’utiliser directement dans empty () ou isset (). L’opérateur ternaire suggéré par Kevin est la meilleure option si vous savez que toutes les options de votre fusion sont connues pour être initialisées.

GET['id'],

Il convient de noter qu’en raison du traitement des variables non initiées et des index de tableaux par PHP, tout type de fonction de coalesce est d’une utilité limitée. J'aimerais pouvoir faire ceci:

<*>

Mais dans la plupart des cas, cela provoquera une erreur de PHP avec un E_NOTICE. Le seul moyen sûr de tester l’existence d’une variable avant de l’utiliser est de l’utiliser directement dans empty () ou isset (). L’opérateur ternaire suggéré par Kevin est la meilleure option si vous savez que toutes les options de votre fusion sont connues pour être initialisées.

SESSION['id'], null);

Mais dans la plupart des cas, cela provoquera une erreur de PHP avec un E_NOTICE. Le seul moyen sûr de tester l’existence d’une variable avant de l’utiliser est de l’utiliser directement dans empty () ou isset (). L’opérateur ternaire suggéré par Kevin est la meilleure option si vous savez que toutes les options de votre fusion sont connues pour être initialisées.

Assurez-vous d’indiquer exactement comment vous souhaitez que cette fonction fonctionne avec certains types. PHP possède une grande variété de fonctions de vérification de type ou similaires, alors assurez-vous de savoir comment elles fonctionnent. Ceci est 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 constater, empty () renvoie true pour tous ces éléments, mais is_null () ne le fait que pour 2 d'entre eux.

Je développe la réponse publiée par Ethan Kent . Cette réponse supprimera les arguments non nuls dont la valeur est false en raison du fonctionnement interne de array_filter , qui n'est pas ce qu'une fonction coalesce fait habituellement. Par exemple:

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

Oops

Pour résoudre ce problème, un second argument et une définition de fonction sont nécessaires. La fonction callable est chargée de dire à array_filter s'il faut ou non ajouter la valeur de tableau actuelle au tableau de résultats:

// "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' en tant que deuxième argument de array_filter , sans succès.

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];
}

PHP 5.3+, avec des fermetures:

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top