De nombreux langages de programmation ont une fonction de fusion (renvoie la première valeur non NULL, par exemple ). PHP, malheureusement en 2009, ne le fait pas.
Quel serait un bon moyen d'en implémenter un en PHP jusqu'à ce que PHP lui-même obtienne une fonction de fusion?
??
deRéponses:
Il y a un nouvel opérateur dans php 5.3 qui fait ceci:
?:
Source: http://www.php.net/ChangeLog-5.php#5.3.0
la source
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
retournefalse
. L'opérateur est en effet sain d'esprit.PHP 7 a introduit un véritable opérateur de fusion :
Si la valeur avant le
??
n'existe pas ou estnull
la valeur après la??
prise.L'amélioration par rapport à l'
?:
opérateur mentionné est que le??
gère également les variables non définies sans lancer de fichierE_NOTICE
.la source
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
over??
, cependant, est qu'il fusionne également des valeurs vides, ce qui??
n'est pas le cas. Semblable au comportement de l'opérateur logique OR en JavaScript (c'est-à-dire$val || 'default'
), je trouverais?:
une forme plus pratique de fusion si dans notre pratique nous nous retrouvons finalement à gérer à la fois vide et nul de la même manière (c'est-à-dire$val ?: 'default'
). Et si vous voulez forcer le problème plus loin et avalerE_NOTICE
, vous pouvez même argumenter ceci:echo @$val ?: 'default';
Premier hit pour "php coalesce" sur google.
http://drupial.com/content/php-coalesce
la source
J'aime vraiment l'opérateur?:. Malheureusement, il n'est pas encore implémenté dans mon environnement de production. J'utilise donc l'équivalent de ceci:
la source
coalesce
est censé renvoyer le premier argument non nul qu'il rencontre, qui incluraitFALSE
. Cette fonction supprimeraFALSE
cependant, probablement pas ce que op a à l'esprit (du moins pas ce que je voudrais d'unecoalesce
fonction).Il est intéressant de noter qu'en raison du traitement par PHP des variables non activées et des indices de tableau, tout type de fonction de fusion est d'une utilisation limitée. J'adorerais pouvoir faire ceci:
Mais cela provoquera, dans la plupart des cas, une erreur 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.
la source
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
).??
pour rendre cette opération très courante plus concise.Assurez-vous d'identifier exactement comment vous souhaitez que cette fonction fonctionne avec certains types. PHP a 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 de is_null () et empty ()
Comme vous pouvez le voir, empty () renvoie true pour tous ceux-ci, mais is_null () ne le fait que pour 2 d'entre eux.
la source
Je développe la réponse publiée par Ethan Kent . Cette réponse supprimera les arguments non nuls évalués à faux en raison du fonctionnement interne de array_filter , ce qui n'est pas ce qu'une
coalesce
fonction fait généralement. Par exemple:Pour surmonter cela, un deuxième argument et une définition de fonction sont nécessaires. La fonction appelable est chargée de dire
array_filter
s'il faut ou non ajouter la valeur actuelle du tableau au tableau de résultats:Ce serait bien si vous pouviez simplement passer
isset
ou'isset'
comme deuxième argumentarray_filter
, mais pas de chance.la source
J'utilise actuellement ceci, mais je me demande s'il ne pourrait pas être amélioré avec certaines des nouvelles fonctionnalités de PHP 5.
la source
PHP 5.3+, avec fermetures:
Démo: https://eval.in/187365
la source