PHP关联数组仅用于键

时间:2013-04-10 19:49:23

标签: php arrays

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

这将是一项节省空间的措施。看起来“null”会分配空间。

4 个答案:

答案 0 :(得分:2)

没有。数组元素始终具有键和值,但是如果您不关心(即空字符串),您可以将任何内容作为值。在您的情况下,您应该将这些键添加到您的数组中,这些键值很重要,即true。然后,当你将要找到它并且无法找到你可以假设它是错误的。但总的来说,你做错了。你并不是真的在这里保存,而是让你的代码不干净,难以阅读和维护。不要这样做

答案 1 :(得分:1)

如果您不想拥有类似于accoc数组的字典结构,那么您只需要一组值,如下所示:

$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()慢得多。


结论:在处理器和内存消耗方面,我建议使用PHP的第二个建议。内存消耗应与数字数组相同,但搜索操作已经过优化。

答案 2 :(得分:1)

如果我理解正确的话。 您打算使用这样的关联数组:

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

如果存在密钥,则bool为“true”。

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

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

如果值存在,则bool为“true”。

答案 3 :(得分:-1)

是的,这是可能的。您还可以使用array_key_exists检查这些值。 PHP从实际的数据存储中分离变量名称的哈希映射(如果您感兴趣,可以在zval上使用google)。有了这个说法,数组还必须为每个元素都有一个相关的“桶”结构,这取决于你的操作系统和编译选项可以大到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';