如何检查数组元素是否存在?

ope*_*rog 55 php

示例:我正在检查是否存在这样的数组元素:

if (!self::$instances[$instanceKey]) {
    $instances[$instanceKey] = $theInstance;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到此错误:

Notice: Undefined index: test in /Applications/MAMP/htdocs/mysite/MyClass.php on line 16
Run Code Online (Sandbox Code Playgroud)

当然,我第一次想要一个实例时,$ instances将不知道密钥.我想我检查可用实例是错误的?

Pas*_*TIN 104

您可以使用语言构造isset或函数array_key_exists.

isset应该更快一点(因为它不是一个函数),但如果元素存在并且具有值,则返回false NULL.


例如,考虑这个数组:

$a = array(
    123 => 'glop', 
    456 => null, 
);
Run Code Online (Sandbox Code Playgroud)

这三项测试依赖于isset:

var_dump(isset($a[123]));
var_dump(isset($a[456]));
var_dump(isset($a[789]));
Run Code Online (Sandbox Code Playgroud)

第一个会得到你(元素存在,并且不是null):

boolean true
Run Code Online (Sandbox Code Playgroud)

虽然第二个会得到你(元素存在,但是为null):

boolean false
Run Code Online (Sandbox Code Playgroud)

最后一个会得到你(元素不存在):

boolean false
Run Code Online (Sandbox Code Playgroud)


另一方面,使用array_key_exists这样:

var_dump(array_key_exists(123, $a));
var_dump(array_key_exists(456, $a));
var_dump(array_key_exists(789, $a));
Run Code Online (Sandbox Code Playgroud)

你会得到这些输出:

boolean true
boolean true
boolean false
Run Code Online (Sandbox Code Playgroud)

因为,在第一种情况下,元素存在 - 即使在第二种情况下它是null.当然,在第三种情况下,它不存在.


对于像你这样的情况,我通常会使用isset,考虑到我从来没有在第二种情况下...但是选择使用哪一种现在取决于你;-)

例如,您的代码可能会变成这样:

if (!isset(self::$instances[$instanceKey])) {
    $instances[$instanceKey] = $theInstance;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不抱怨,因为“isset”是拼写错误不安全的。称为`$form = [1 => 5]; var_dump(isset($from[1]));` 返回 `false`,因为 `$from` 不存在,并且您甚至不会收到 `E_NOTICE` 通知。更慢但更安全的“array_key_exists”为我做这件事。 (2认同)

Laz*_*iko 27

与isset()相比,array_key_exists()是SLOW.这两者的组合(见下面的代码)会有所帮助.

它在保持正确的检查结果的同时获得了isset()的性能优势(即使数组元素为NULL,也返回TRUE)

if (isset($a['element']) || array_key_exists('element', $a)) {
       //the element exists in the array. write your code here.
}
Run Code Online (Sandbox Code Playgroud)

基准比较:(摘自以下博客文章).

array_key_exists() only : 205 ms
isset() only : 35ms
isset() || array_key_exists() : 48ms
Run Code Online (Sandbox Code Playgroud)

请参见 http://thinkofdev.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/http://thinkofdev.com/php-isset-and-multi-维阵列/

详细讨论.


mis*_*tor 10

您可以使用该功能array_key_exists来执行此操作.

例如,

$a=array("a"=>"Dog","b"=>"Cat");
if (array_key_exists("a",$a))
  {
  echo "Key exists!";
  }
else
  {
  echo "Key does not exist!";
  }
Run Code Online (Sandbox Code Playgroud)

PS:从这里取的例子.


Sam*_*son 6

你可以用它isset()来做这件事.

$myArr = array("Name" => "Jonathan");
print (isset($myArr["Name"])) ? "Exists" : "Doesn't Exist" ;
Run Code Online (Sandbox Code Playgroud)


小智 6

根据php手册,您可以通过两种方式执行此操作.这取决于你需要检查的内容.

如果要检查数组中是否存在给定的键或索引,请使用array_key_exists

<?php
$search_array = array('first' => 1, 'second' => 4);
if (array_key_exists('first', $search_array)) {
echo "The 'first' element is in the array";
 }
?>
Run Code Online (Sandbox Code Playgroud)

如果要检查数组中是否存在值,请使用in_array

 <?php
 $os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Got Irix";
}
?>
Run Code Online (Sandbox Code Playgroud)