是否可以声明数组元素键而不将其定义为值(如非数组变量)?这样,如果您有一个关联的布尔值数组,您只需要检查键是否存在而不是分配一个布尔值。但是您仍然具有在检查键是否存在时不必遍历数组的优势。
这将是一种节省空间的措施。似乎“空”获得了分配空间。
如果您不想在 accoc 数组中使用字典结构,那么您只需要一组值,如下所示:
$array = ('red', 'green', 'blue');
要检查一个键(项目)是否存在,只需使用in_array()
:
if(in_array('red', $array)) {
// -> found
}
但是,您应该注意,在这种情况下,php 将在内部创建数字索引。
另一种方法是将 TRUE 分配给所有值。这至少会占用更少的内存。像这样
$array (
'red' => TRUE,
'green' => TRUE,
'blue' => TRUE
);
isset()
并使用Like检查存在:
if(isset($array['red'])) {
// -> found
}
注意:我不建议您使用NULL
该值。这是因为您不能isset()
在这种情况下使用,因为如果键的值为 NULL,则 isset 将返回 false。在这种情况下,您必须使用array_key_exists()
比isset()
.
结论:在处理器和内存消耗方面,我建议 PHP 中的第二个建议。内存消耗应与数值数组相同,但搜索操作已优化。
不。数组元素总是有键和值,但是如果你不关心,你可以把任何东西作为你的值(即空字符串)。在您的情况下,您应该只将这些键添加到您的数组中,它们是有价值的,即true
. 然后,当您正在寻找它并且找不到它时,您可以假设它是错误的。但总的来说,你做错了事。您并没有真正保存在这里,而是使您的代码不干净并且难以阅读和维护。不要这样做
如果我理解正确。您计划使用这样的关联数组:
key value
"bool1" ""
"bool2" ""
"bool3" ""
如果存在密钥,则布尔值为“真”。
为什么不只使用这样的普通数组?:
key value
1 "bool1"
2 "bool2"
3 "bool3"
如果该值存在,则布尔值为“真”。
是的,这是可能的。您还可以使用 array_key_exists 来检查这些值。PHP 将变量名的哈希映射与实际的数据存储区分开来(如果您有兴趣,请在 zval 上搜索)。话虽如此,数组还需要为每个元素具有关联的“桶”结构,这取决于您的操作系统和编译选项,可能高达 96 字节/每个。顺便说一句,Zval 每个也多达 48 个字节。
但是,我认为您不会从该方案中获得太多价值,但纯粹从假设的角度来看,您可以存储空值。
<?php
$foo = array('a' => null, 'b' => null);
if (array_key_exists('a', $foo))
echo 'a';
但是,与初始化为布尔值相比,这不会为您节省任何内存。然后,您可以执行一个比对 array_key_exists 进行函数调用更快的 isset。
<?php
$foo = array('a' => true, 'b' => true);
if (isset($foo['a']))
echo 'a';