我发现如果在数组引用中设置了一个键,则array_key_exists比isset检查时慢1000倍.是否有人了解PHP的实现方式解释了为什么这是真的?
编辑:我添加了另一个案例,似乎指出在使用引用调用函数时需要开销.
基准示例
function isset_( $key, array $array )
{
return isset( $array[$key] );
}
$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) {
array_key_exists( $i, $my_array );
$my_array[$i] = 0;
}
$stop = microtime( TRUE );
print "array_key_exists( \$my_array ) ".($stop-$start).PHP_EOL;
unset( $my_array, $my_array_ref, $start, $stop, $i );
$my_array = array();
$start = microtime( TRUE );
for( $i = 1; $i < 10000; $i++ ) { …Run Code Online (Sandbox Code Playgroud) 我见过很多人做过前者,有没有比其他人更好的表现?或者它只是一个眼睛糖果?我个人每次都使用后者,因为它更短,个人对我更具可读性.
我正在尝试此代码来检查数组中是否存在值.
$arr = array ('2' => '0', '3' => '0.58');
$num=3;
if (array_key_exists($num, $arr)) {
echo (array_key_exists($num, $arr)); //show the index, in this case 1
}
Run Code Online (Sandbox Code Playgroud)
我想要的是显示相应的价值,换句话说, 0.58
我怎样才能做到这一点 ?
我有一系列世界上所有国家:
$countries = array(
"GB" => "United Kingdom",
"US" => "United States",
"AF" => "Afghanistan",
"AL" => "Albania",
"DZ" => "Algeria",
"AS" => "American Samoa",
"AD" => "Andorra",
"AO" => "Angola",
"AI" => "Anguilla",
"AQ" => "Antarctica",
"AG" => "Antigua And Barbuda",
"AR" => "Argentina",
"AM" => "Armenia",
"AW" => "Aruba",
"AU" => "Australia",
"AT" => "Austria",
"AZ" => "Azerbaijan",
"BS" => "Bahamas",
"BH" => "Bahrain",
"BD" => "Bangladesh",
"BB" => "Barbados",
"BY" => "Belarus",
"BE" => "Belgium",
"BZ" => …Run Code Online (Sandbox Code Playgroud) 我做了很多搜索,但无法弄清楚这个.
我有这样一个数组:
$array = array(cat => 0, dog => 1);
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的字符串:
I like cats.
Run Code Online (Sandbox Code Playgroud)
我想看看字符串是否匹配数组中的任何键.我尝试以下但显然它不起作用.
array_key_exists("I like cats", $array)
Run Code Online (Sandbox Code Playgroud)
假设我可以在给定时间获得任何随机字符串,我该怎么做这样的事情?
伪代码:
array_key_exists("I like cats", *.$array.*)
//The value for cat is "0"
Run Code Online (Sandbox Code Playgroud)
请注意,我想检查是否存在任何形式的"cat".它可以是猫,天使,甚至像vbncatnm这样的随机字母.我从一个mysql数据库获取数组,我需要知道哪个ID猫或狗.
在研究如何检测数组中的空值时,我在http://www.php.net/manual/en/function.array-key-exists.php手册页下看到了一些用户的评论.
它说
if (isset(..) || array_key_exists(...))
{
...
}
Run Code Online (Sandbox Code Playgroud)
比做更快
if array_key_exists(...))
{
...
}
Run Code Online (Sandbox Code Playgroud)
发布了100000次运行的基准测试
array_key_exists() : 205 ms
is_set() : 35ms
isset() || array_key_exists() : 48ms
Run Code Online (Sandbox Code Playgroud)
我的问题:
是(isset(..) || array_key_exists(...))不是更快array_key_exists()?如果是这样,为什么?
编辑:在写出这个问题时,我想我找到了答案.无论如何,我决定发布这个问题,看看我的想法是否正确.
我有这个数组:
$variableNames = [
'x1',
'x2',
'x3',
'x4',
'x5',
'x6',
'x7'
];
Run Code Online (Sandbox Code Playgroud)
但是,当我使用这样的array_key_exists函数时:
array_key_exists('x3', $this->variableNames)
Run Code Online (Sandbox Code Playgroud)
它回来了false.但是,如果我有这个数组:
$variableNames = [
'x1' => null,
'x2' => null,
'x3' => null,
'x4' => null,
'x5' => null,
'x6' => null,
'x7' => null
];
Run Code Online (Sandbox Code Playgroud)
它回来了true.我如何使用第一个数组,并得到true?在第一个数组中,值也是null,就像第二个数组一样.那么,为什么第一个数组返回false而第二个数组返回true?
我的数据是从客户的CMS中提取的,但结果却很奇怪
print_r($appliance_data);
foreach ($appliance_data as $adKey => $adValue) {
print_r($adKey);
print_r($adValue);
print_r(array_key_exists($adKey, $appliance_data));
print_r(isset($appliance_data[$adKey]));
}
Run Code Online (Sandbox Code Playgroud)
带输出
Array
(
[94] => stdClass Object
(
[operation] => 0
[value] => 0
)
[102] => stdClass Object
(
[operation] => 501
[value] => 4
)
[90] => stdClass Object
(
[operation] => 0
[value] => 0
)
)
94
stdClass Object
(
[operation] => 0
[value] => 0
)
(boolean) FALSE
(boolean) FALSE
102
stdClass Object
(
[operation] => 501
[value] => 4 …Run Code Online (Sandbox Code Playgroud) 我有一个类似如下的数组:
Array (
[0] => Array (
[slideID] => 3
[parentSlideID] => 1
[subSlideOrder] => 1
[headline] =>
[copy] =>
[colourID] => 0
[URL] => 2.jpg
[category] => 1
[visible] => 1
[slideOrder] => 2
[type] => 0 )
[1] => Array (
[slideID] => 3
[parentSlideID] => 1
[subSlideOrder] => 1
[headline] =>
[copy] =>
[colourID] => 0
[URL] => 2.jpg
[category] => 1
[visible] => 1
[slideOrder] => 2
[type] => 0 )
[2] => Array (
[slideID] …Run Code Online (Sandbox Code Playgroud) 我来自 javascript 并且知道如何检查变量是否存在。我们可以用!!var
我在 Go 中遇到了一个数组,我想知道索引是否存在:
myArr := []int{1, 2, 3}
if myArr[3] {
fmt.Println("YES")
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它给了我一个错误: Index Out Of Range: 3