web-dev-qa-db-ja.com

配列(辞書)からキーでデフォルト値を取得するためのより良いPHPの方法はありますか?

Pythonでできること:

foo = {}
assert foo.get('bar', 'baz') == 'baz'

[〜#〜] php [〜#〜]では、次のように3項演算子を使用できます。

$foo = array();
assert( (isset($foo['bar'])) ? $foo['bar'] : 'baz' == 'baz');

ゴルフバージョンを探しています。 PHPで短縮/改善できますか?

44

私はこの小さなヘルパー関数を思いつきました:

_function get(&$var, $default=null) {
    return isset($var) ? $var : $default;
}
_

これは辞書だけでなく、あらゆる種類の変数で機能します。

_$test = array('foo'=>'bar');
get($test['foo'],'nope'); // bar
get($test['baz'],'nope'); // nope
get($test['spam']['eggs'],'nope'); // nope
get($undefined,'nope'); // nope
_

参照ごとに以前に未定義の変数を渡しても、NOTICEエラーは発生しません。代わりに、参照により_$var_を渡すと定義され、nullに設定されます渡された変数がnullの場合、デフォルト値も返されます。また、spam/eggsの例で暗黙的に生成された配列にも注意してください。

_json_encode($test); // {"foo":"bar","baz":null,"spam":{"eggs":null}}
$undefined===null; // true (got defined by passing it to get)
isset($undefined) // false
get($undefined,'nope'); // nope
_

_$var_は参照で渡されますが、get($var)の結果は参照ではなく_$var_のコピーになることに注意してください。これがお役に立てば幸いです!

44
stepmuel

時間が経つとPHPは進化しています。PHP7は null合体演算子??

// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
45
Ivan Yarych

エラー制御演算子を使用@ with PHP 5.3三項演算子のショートカットバージョン:

$bar = @$foo['bar'] ?: 'defaultvalue';
19
romanlv

次のような関数を作成すると便利です。

function array_value($array, $key, $default_value = null) {
    return is_array($array) && array_key_exists($key, $array) ? $array[$key] : $default_value;
}

そして、次のように使用します:

$params = array('code' => 7777, 'name' => "Cloud Strife"); 

$code    = array_value($params, 'code');
$name    = array_value($params, 'name');
$weapon  = array_value($params, 'weapon', "Buster Sword");
$materia = array_value($params, 'materia');

echo "{ code: $code, name: $name, weapon: $weapon, materia: $materia }";

この場合のデフォルト値はnullですが、必要に応じて設定できます。

役に立つことを願っています。

7
rbento

PHP 5.3には、三項演算子のショートカットバージョンがあります。

$x = $foo ?: 'defaultvaluehere';

基本的には

if (isset($foo)) {
   $x = $foo;
else {
   $x = 'defaultvaluehere';
}

それ以外の場合、いいえ、短い方法はありません。

6
Marc B

それを行うための「少し」ハックな方法:

<?php
    $foo = array();
    var_dump('baz' == $tmp = &$foo['bar']);
    $foo['bar'] = 'baz';
    var_dump('baz' == $tmp = &$foo['bar']);

http://codepad.viper-7.com/flXHCH

明らかに、これは実際にそれを行うのに良い方法ではありません。しかし、他の状況では便利です。例えば。私はよくGETとPOSTそのような変数へのショートカットを宣言します:

<?php
    $name =& $_GET['name'];
    // instead of
    $name = isset($_GET['name']) ? $_GET['name'] : null;

PS:これを「ビルトイン==$_=&特別な比較演算子」:

<?php
    var_dump('baz' ==$_=& $foo['bar']);

PPS:ええ、明らかに使用できます

<?php
    var_dump('baz' == @$foo['bar']);

しかし、それは==$_=&演算子。人々はエラー抑制演算子をあまり好きではありません。

5
NikiC

配列のキーでデフォルト値を列挙する場合、次の方法で実行できます。

$foo = array('a' => 1, 'b' => 2);
$defaults = array('b' => 55, 'c' => 44);

$foo = array_merge($defaults, $foo);

print_r($foo);

結果:

Array
(
    [b] => 2
    [c] => 44
    [a] => 1
)

デフォルトを列挙するキー/値のペアが多いほど、code-golfは良くなります。

2
Rusty Fausak

"Marc B"によって提案された解決策 が三項ショートカット$x = $foo ?: 'defaultvaluehere';しかし、それはまだ通知を与えます。多分それはタイプミスです、多分彼はどういう意味ですか?または、PHP 7リリース。 Ternary description によると:

PHP 5.3であるため、三項演算子の中央部分を省略することができます。式expr1 ?: expr3 戻り値 expr1 if expr1TRUEと評価され、expr3 さもないと。

ただし、内部でissetを使用せず、通知を生成します。通知を避けるために Null Coalescing Operator??issetを使用します。 PHP 7。

式(expr1)?? (expr2)expr1がNULLの場合はexpr2に評価され、それ以外の場合はexpr1に評価されます。特に、この演算子は、isset()のように左側の値が存在しない場合、通知を発行しません。これは、配列キーで特に役立ちます。

例5デフォルト値の割り当て

<?php
// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'default';

// The above is identical to this if/else statement
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}

?>