133

多くのプログラミング言語には合体関数があります (最初の NULL 以外の値を返します、example )。悲しいことに、PHP は 2009 年にはそうではありません。

PHP自体が合体機能を取得するまで、PHPで実装する良い方法は何でしょうか?

4

9 に答える 9

199

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

于 2009-12-12T01:32:16.670 に答える
69

PHP 7 では、本当の合体演算子が導入されました。

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

の前の値??が存在しない場合、またはnullの後の値である場合??は取得されます。

上記の?:演算子に対する改善点は、 が??をスローせずに未定義の変数も処理することE_NOTICEです。

于 2015-06-24T08:35:01.407 に答える
30

「php 合体」がグーグルで初ヒット。

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

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

于 2009-06-18T15:51:34.407 に答える
18

?: 演算子がとても気に入っています。残念ながら、私の実稼働環境にはまだ実装されていません。だから私はこれと同等のものを使用します:

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}
于 2011-01-14T04:58:25.753 に答える
10

初期化されていない変数と配列インデックスの PHP の処理により、あらゆる種類の合体関数の使用が制限されることに注意してください。これができるようになりたいです:

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

しかし、ほとんどの場合、これにより PHP は E_NOTICE でエラーになります。変数を使用する前にその存在をテストする唯一の安全な方法は、変数を empty() または isset() で直接使用することです。合体のすべてのオプションが初期化されることがわかっている場合は、ケビンが提案する三項演算子が最適なオプションです。

于 2010-05-16T19:03:07.577 に答える
6

この関数が特定の型でどのように機能するかを正確に特定してください。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 つに対してのみ true を返します。

于 2009-06-18T16:43:18.600 に答える
2

Ethan Kentが投稿した回答を拡張しています。その答えは、関数が通常行うことではないarray_filterの内部動作のために false と評価される null 以外の引数を破棄します。coalesce例えば:

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

おっとっと

これを克服するには、2 番目の引数と関数定義が必要です。呼び出し可能な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'));
}

issetor'isset'の 2 番目の引数として単に渡すことができればいいのですarray_filterが、そのような運はありません。

于 2013-02-20T22:27:36.273 に答える
0

現在これを使用していますが、PHP 5 の新機能のいくつかで改善できなかったのでしょうか。

function coalesce() {
  $args = func_get_args();
  foreach ($args as $arg) {
    if (!empty($arg)) {
    return $arg;
    }
  }
  return $args[0];
}
于 2009-06-18T15:54:44.377 に答える
0

PHP 5.3+、クロージャあり:

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

デモ: https://eval.in/187365

于 2014-09-02T20:21:54.690 に答える