array_key_exists()
関数を使うのは構わない。実際、私はや(感受性を避けるために取り消し線を引いた) のように将来動作が変わる可能性のあるハック関数に頼るよりも、この特定の関数を使用することを好みます。empty
isset
ただし、これで便利な単純な関数と、配列インデックスを処理する他の状況を使用します。
function Value($array, $key, $default = false)
{
if (is_array($array) === true)
{
settype($key, 'array');
foreach ($key as $value)
{
if (array_key_exists($value, $array) === false)
{
return $default;
}
$array = $array[$value];
}
return $array;
}
return $default;
}
次の配列があるとします。
$arr1 = array
(
'xyz' => 'value'
);
$arr2 = array
(
'x' => array
(
'y' => array
(
'z' => 'value',
),
),
);
配列から「値」を取得するにはどうすればよいですか? 単純:
Value($arr1, 'xyz', 'returns this if the index does not exist');
Value($arr2, array('x', 'y', 'z'), 'returns this if the index does not exist');
すでに 1 次元配列と多次元配列をカバーしていますが、他に何ができるでしょうか?
たとえば、次のコードを見てください。
$url = 'https://stackoverflow.com/questions/1960509';
$domain = parse_url($url);
if (is_array($domain) === true)
{
if (array_key_exists('host', $domain) === true)
{
$domain = $domain['host'];
}
else
{
$domain = 'N/A';
}
}
else
{
$domain = 'N/A';
}
かなり退屈ですね。Value()
関数を使用した別のアプローチを次に示します。
$url = 'https://stackoverflow.com/questions/1960509';
$domain = Value(parse_url($url), 'host', 'N/A');
追加の例として、テスト用の関数を取り上げます。RealIP()
$ip = Value($_SERVER, 'HTTP_CLIENT_IP', Value($_SERVER, 'HTTP_X_FORWARDED_FOR', Value($_SERVER, 'REMOTE_ADDR')));
いいですね。;)