web-dev-qa-db-ja.com

PHPの合体機能?

多くのプログラミング言語には合体機能があります(最初のNULL以外の値 example を返します)。残念ながら2009年のPHPはそうではありません。

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

129
mikl

これを行う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.

189
Kevin

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

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

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

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

62
flori

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

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

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

29
Will Shaver

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

function coalesce() {
  return array_shift(array_filter(func_get_args()));
}
18
Ethan Kent

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

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

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

9
Andrew

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

6
Peter Bailey

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

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

Oops

これを克服するには、2番目の引数と関数定義が必要です。 callable関数は、現在の配列値を結果の配列に追加するかどうかを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への2番目の引数として単に渡すことができればいいのですが、そのような運はありません。

2
Madbreaks

現在これを使用していますが、PHP 5。

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

PHP 5.3以降、クロージャー付き:

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

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

0
Paulo Freitas