Функция объединения для PHP?

многие языки программирования имеют функцию coalesce (возвращает первое ненулевое значение,пример). PHP, к сожалению, в 2009 году этого не делает.

Что было бы хорошим способом реализовать один в PHP, пока PHP сам не получит функцию объединения?

9 ответов


в php 5.3 есть новый оператор, который делает следующее:?:

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

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

// B
echo false ?: 'B';

// B
echo null ?: 'B';

источник:http://www.php.net/ChangeLog-5.php#5.3.0


PHP 7 представил реальный оператор коалесцируют:

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

если значение перед ?? не существует или null значение после это.

улучшение по сравнению с упомянутым ?: оператора, что ?? также обрабатывает неопределенные переменные, не выдавая себя E_NOTICE.


первый хит для "php coalesce" в google.

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

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


Мне очень нравится ?: оператор. К сожалению, он еще не реализован в моей производственной среде. Поэтому я использую эквивалент этого:

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

стоит отметить, что из-за обработки PHP неинициализированных переменных и индексов массива любой вид функции coalesce имеет ограниченное использование. Я хотел бы иметь возможность сделать это:

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

но в большинстве случаев это приведет к ошибке PHP с E_NOTICE. Единственный безопасный способ проверить существование переменной перед ее использованием-использовать ее непосредственно в empty () или isset (). Троичный оператор, предложенный Кевином, является лучшим вариантом, если вы знаете, что все варианты в вашем известно, что объединение инициализировано.


убедитесь, что вы точно определяете, как эта функция должна работать с определенными типами. PHP имеет широкий спектр функций проверки типов или аналогичных функций, поэтому убедитесь, что вы знаете, как они работают. Это пример сравнения is_null () и 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>';
}

Как вы можете видеть, empty() возвращает true для всех из них, но is_null () делает это только для 2 из них.


я расширяю ответ, опубликованный Этан Кент. Этот ответ отбросит ненулевые аргументы, которые оцениваются как false из-за внутренней работы array_filter, что не то, что


в настоящее время я использую это, но мне интересно, нельзя ли улучшить некоторые из новых функций в PHP 5.

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

на PHP 5.3+, с крышками:

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

демо:https://eval.in/187365