是否可以声明一个数组元素键而不定义它的值(就像非数组变量一样)?这样,如果您有一个布尔类型的关联数组,您只需要检查键是否存在,而不是分配一个布尔值。但您仍然可以享受不必在检查键是否存在时迭代数组的优势。
这将是一项节省空间的措施。似乎“null”会被分配空间。
如果您不想像在关联数组中那样拥有字典结构,而只是想要一组值,就像这样:
$array = ('red', 'green', 'blue');
要检查一个键(项)是否存在,只需使用in_array()
:
if(in_array('red', $array)) {
// -> found
}
然而,你需要注意的是在这种情况下php会内部创建数字索引。
另一种方法是将所有值都赋值为TRUE。这样至少会占用更少的内存。就像这样:
$array (
'red' => TRUE,
'green' => TRUE,
'blue' => TRUE
);
使用 isset()
检查变量是否存在,格式如下:
if(isset($array['red'])) {
// -> found
}
注意:我不建议您使用NULL
作为值。这是因为在这种情况下,您无法使用isset()
,因为如果键的值为NULL,则isset将返回false。在这种情况下,您必须使用array_key_exists()
,但它比isset()
慢得多。
TRUE
作为值。 - hek2mgl数组元素总是具有键和值,但如果您不关心值(即空字符串),则可以将任何内容作为值放入其中。在您的情况下,您应该只向数组中添加这些具有值的键,例如true
。然后,当您查找它时无法找到它时,您可以假设它为假。但总的来说,您正在做错事。这样做不仅无法节省代码,还会使代码难以阅读和维护。请不要这样做。
key value
"bool1" ""
"bool2" ""
"bool3" ""
key value
1 "bool1"
2 "bool2"
3 "bool3"
是的,这是可能的。您还可以使用array_key_exists来检查这些值。PHP将变量名称的哈希映射与实际数据存储分开(如果您感兴趣,请在Google上搜索zval)。话虽如此,数组在每个元素上还需要有一个关联的“bucket”结构,这取决于您的操作系统和编译选项,可以高达96字节/每个。顺便说一句,zvals每个也高达48字节。
然而,我认为您不太可能从这种方案中获得太多价值,但纯粹从假设的角度来看,您可以存储空值。
<?php
$foo = array('a' => null, 'b' => null);
if (array_key_exists('a', $foo))
echo 'a';
然而,与初始化为布尔值相比,这并不会节省任何内存。这将使您执行isset,这比调用array_key_exists函数更快。
<?php
$foo = array('a' => true, 'b' => true);
if (isset($foo['a']))
echo 'a';
array_search()
呢?值的不存在等于布尔值未设置。 - Michael Berkowski