Pergunta

Muitas linguagens de programação têm uma função coalesce (retorna o primeiro valor não-NULL, exemplo ). PHP, infelizmente, em 2009, não funciona.

O que seria uma boa maneira de implementar um em PHP até si PHP recebe uma função coalesce?

Foi útil?

Solução

Há um novo operador no PHP 5.3, que faz isso: ?:

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

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

// B
echo false ?: 'B';

// B
echo null ?: 'B';

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

Outras dicas

PHP 7 introduziu uma verdadeira operador coalesce :

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

Se o valor antes da ?? não existe ou é null o valor após a ?? é tomada.

A melhoria sobre o operador ?: mencionado é que o ?? também lida com variáveis ??indefinidas sem lançar uma E_NOTICE.

Primeiro bateu para "php coalesce" no Google.

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

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

Eu realmente gosto do operador?:. Infelizmente, ainda não está implementado no meu ambiente de produção. Então, eu uso o equivalente a isso:

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

É interessante notar que, devido ao tratamento de variáveis ??uninitalised e índices de array do PHP, qualquer tipo de função coalesce é de uso limitado. Eu adoraria ser capaz de fazer isso:

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

Mas essa vontade, na maioria dos casos, causa PHP para erro com um E_NOTICE. A única maneira segura de testar a existência de uma variável antes de o utilizar é usá-lo directamente em vazio () ou isset (). O operador ternário sugerido por Kevin é a melhor opção se você sabe que são conhecidas todas as opções em seu coalesce para ser inicializado.

Certifique-se de identificar exatamente como você deseja que esta função para trabalhar com certos tipos. PHP tem uma grande variedade de tipo de verificação ou funções semelhantes, por isso certifique-se de saber como eles funcionam. Este é um exemplo de comparação is_null () e vazia ()

$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>';
}

Como você pode ver, esvaziar () retorna true para todos eles, mas is_null () só faz isso por 2 deles.

Eu estou expandindo a resposta enviada por Ethan Kent . Essa resposta vai descartar argumentos não-nulos que avaliam a falsa devido aos trabalhos internos de array_filter , o que não é o que uma função coalesce normalmente faz. Por exemplo:

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

Opa

Para superar isso, um segundo argumento e definição de função são necessários. O exigível função é responsável por dizer array_filter se deve ou não adicionar o valor de matriz atual para a matriz resultado:

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

Seria bom se você pudesse simplesmente passar isset ou 'isset' como o 2º argumento para array_filter, mas não tive essa sorte.

Atualmente estou usando isso, mas eu me pergunto se ele não poderia ser melhorado com alguns dos novos recursos do PHP 5.

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

PHP 5.3+, com fechos:

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

Demonstração: https://eval.in/187365

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top