3

是否可以声明数组元素键而不将其定义为值(如非数组变量)?这样,如果您有一个关联的布尔值数组,您只需要检查键是否存在而不是分配一个布尔值。但是您仍然具有在检查键是否存在时不必遍历数组的优势。

这将是一种节省空间的措施。似乎“空”获得了分配空间。

4

4 回答 4

2

如果您不想在 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 中的第二个建议。内存消耗应与数值数组相同,但搜索操作已优化。

于 2013-04-10T19:55:49.207 回答
2

不。数组元素总是有键和值,但是如果你不关心,你可以把任何东西作为你的值(即空字符串)。在您的情况下,您应该只将这些键添加到您的数组中,它们是有价值的,即true. 然后,当您正在寻找它并且找不到它时,您可以假设它是错误的。但总的来说,你做错了事。您并没有真正保存在这里,而是使您的代码不干净并且难以阅读和维护。不要这样做

于 2013-04-10T19:56:09.267 回答
1

如果我理解正确。您计划使用这样的关联数组:

key      value
"bool1"  ""
"bool2"  ""
"bool3"  ""

如果存在密钥,则布尔值为“真”。

为什么不只使用这样的普通数组?:

key   value
1     "bool1"
2     "bool2"
3     "bool3"

如果该值存在,则布尔值为“真”。

于 2013-04-10T20:31:04.337 回答
-1

是的,这是可能的。您还可以使用 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';
于 2013-04-10T19:56:31.173 回答