Функция объединения для PHP?
-
06-07-2019 - |
Вопрос
Многие языки программирования имеют функцию объединения (возвращает первое значение, отличное от NULL, пример).PHP, к сожалению, в 2009 году этого не делает.
Каков был бы хороший способ реализовать его в PHP, пока сам PHP не получит функцию объединения?
Решение
В php 5.3 есть новый оператор, который делает это: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
Другие советы
В PHP 7 появился настоящий оператор объединения :
echo В PHP 7 появился настоящий оператор объединения :
<*>
Если значение до ??
не существует или null
, то значение после ??
берется. Р>
По сравнению с упомянутым оператором ?:
улучшено то, что ??
также обрабатывает неопределенные переменные, не выбрасывая E_NOTICE
.
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;
}
Мне действительно нравится оператор?: К сожалению, это еще не реализовано в моей производственной среде. Поэтому я использую эквивалент этого:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
Стоит отметить, что из-за того, что PHP обрабатывает неинициализированные переменные и индексы массивов, любая функция коалесценции имеет ограниченное применение. Я хотел бы быть в состоянии сделать это:
$id = coalesce( Стоит отметить, что из-за того, что PHP обрабатывает неинициализированные переменные и индексы массивов, любая функция коалесценции имеет ограниченное применение. Я хотел бы быть в состоянии сделать это:
<*>
Но в большинстве случаев это приведет к ошибке PHP с E_NOTICE. Единственный безопасный способ проверить существование переменной перед ее использованием - это использовать ее непосредственно в empty () или isset (). Тернарный оператор, предложенный Кевином, является наилучшим вариантом, если вы знаете, что все параметры в вашей коалиции известны как инициализированные.
GET['id'], Стоит отметить, что из-за того, что PHP обрабатывает неинициализированные переменные и индексы массивов, любая функция коалесценции имеет ограниченное применение. Я хотел бы быть в состоянии сделать это:
<*>
Но в большинстве случаев это приведет к ошибке PHP с E_NOTICE. Единственный безопасный способ проверить существование переменной перед ее использованием - это использовать ее непосредственно в empty () или isset (). Тернарный оператор, предложенный Кевином, является наилучшим вариантом, если вы знаете, что все параметры в вашей коалиции известны как инициализированные.
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 из них.
Я расширяю ответ, опубликованный Итан Кент.Этот ответ отбросит ненулевые аргументы, которые оцениваются как ложные из-за внутренней работы array_filter, а это не то, что coalesce
функция обычно так и делает.Например:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
упс
Чтобы преодолеть эту проблему, требуется второй аргумент и определение функции.Тем отзывной функция отвечает за сообщение array_filter
добавлять или нет текущее значение массива в массив результатов:
// "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'));
}
Было бы здорово, если бы вы могли просто пройти мимо isset
или 'isset'
в качестве второго аргумента 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