2013-04-10 78 views
3

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

这将是一个节省空间的措施。看起来'空'会分配空间。

+2

这听起来有点像过早优化。这真的有必要吗?你有数据证明这是必要的吗? – 2013-04-10 19:50:52

+1

我并不是说这是必要的,但如果可以的话,我想节省空间。 – user528451 2013-04-10 19:52:07

+0

这是倒退。为什么不把“key”作为字符串值存储在数组中并使用'array_search()'。不存在值==布尔值未设置。 – 2013-04-10 19:52:37

回答

2

不可以。数组元素总是有键和值,但是如果你不在意(即空字符串),你可以放任何值作为你的值。在你的情况下,你应该把这些键添加到你的数组中,它们的值是true。然后当你会找到它,并将无法找到你可以假设这是错误的。但总的来说,你做错了事。你并不是真的在这里储蓄,而是让你的代码不清楚,难以阅读和维护。不要这样做

1

如果你不希望有一个字典结构就像在accoc数组,然后你只想要一组值,就像这样:

$array = ('red', 'green', 'blue'); 

要检查重点(项目)只是存在使用in_array()

if(in_array('red', $array)) { 
    // -> found 
} 

但是,你要注意,PHP在这种情况下,将在内部创建数字indicies。


另一种方式去将分配TRUE所有值。这至少会减少记忆。如使用isset()像这样

$array (
    'red' => TRUE, 
    'green' => TRUE, 
    'blue' => TRUE 
); 

,并检查是否存在:

if(isset($array['red'])) { 
    // -> found 
} 

注意:我不会建议你用NULL的价值。这是因为在这种情况下您不能使用isset(),因为如果键的值为NULL,isset将返回false。在这种情况下,您必须使用array_key_exists(),这比isset()慢得多。


结论:就处理器和内存消耗而言,我会建议PHP中的第二条建议。内存消耗应该与数值数组相同,但搜索操作是优化的。

+0

你说这些条目没有键,这是不正确的。 – 2013-04-10 19:56:47

+0

确实他们有数字*键*(或更好的指数),但这是与PHP – hek2mgl 2013-04-10 19:57:41

+0

@WebnetMobile你现在快乐吗? – hek2mgl 2013-04-10 20:03:25

-1

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

没有密钥就不可能有数组值。您不能使用自己的密钥,但在这种情况下,输入将被分配自己的唯一密钥 – 2013-04-10 19:58:04

+0

问题问您是否可以有一个键,没有价值,而不是相反。您当然可以拥有一个已分配值为null的密钥。 – gview 2013-04-10 20:00:26

+0

但空值获得分配空间吗? – user528451 2013-04-10 20:06:42

1

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

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

如果一个键存在,那么布尔是“真”。

为什么不直接使用普通的数组,如果该值存在这样?:

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

,那么布尔是“真”。

+0

然后,与O(1)中的密钥查找相比,检查值是否存在需要O(n)个时间。 – user2340939 2017-09-11 21:14:08