在PHP关联数组索引中使用空格是一个不好的做法吗?


Is it a bad practice to use spaces in PHP associative array indexes?

我必须使用关联数组传递一些参数,就像这样:

$blockGroup['name=products type=complete']

做一些测试,我看到它的工作,但这是一个坏的做法?是否有可能产生任何错误或意外行为?

谢谢你的建议!

编辑1

我在视图实现中使用这个数组,完整的结构是:

$blockGroup['name=products type=complete'][] =
    array(
        'name'  => 'GeForce',
        'value' => '99.99'
    );

不,它不是。空间符号在编程中并没有什么特殊的含义。用引号括起来形成字符串的符号可以用作关联数组键。

事实上,在很多时候,在关联数组中使用这样的键会使你的代码更容易阅读,并且便于对它进行修改。

$scores = array("John Doe" => 100, "Ivan Ivanovich" => 75.3);

我看到的是你试图使用数组键作为表达式,这是非常糟糕的做法。事情自有其意义。使用关联键作为关联键

它会工作,并且不是坏做法。空格只是索引字符串中的常规字符。这没有问题。

由于在许多编程情况下,您在数组中使用的索引是动态创建的,因此这是必要的。索引可以是二进制字符串。检查这个例子,典型的情况。我们想从文件中删除重复的行,并且每一行只打印一次:

file.txt

hello world. 
foo bar
hello world
123

example.php

$printed = array(); 
foreach(file('file.txt') as $line) {
    if(isset($printed[$line])) {
        continue; // skip the line
    }
    echo $line;
    $printed[$line] = true; // line will contain spaces
}

我不认为空格是键的问题,但我确实认为使用等号似乎很尴尬。根据你的代码示例,我不明白为什么你不像这样在数组上使用3个维度:


$blockGroup['products']['complete'][] =
    array(
        'name' => 'GeForce',
        'value' => '99.99'
    );

我可能误解了你的情况,但这对我来说似乎更合乎逻辑。

回答您最初的问题,PHP中的关联数组将键映射到值。在这种情况下,你使用的键是字符串,PHP只关心字符串的内容,而不关心字符串是否有空格。我之所以这么说,是因为你似乎不确定它在语言中是否合法(而不仅仅是它是否不好的做法)。

至于这是不是坏习惯,据我所知没有。这取决于上下文,如果这种键自然映射到你想要存储的值,那么它应该是好的

这是有效的语法,但它可能是实现您想要做的任何事情的更好方法。

数组可以有Integer, float, Null, Bool和String键。

在字符串的情况下,PHP在内部将它们表示为字节序列,因此据我所知,通过使用空格或特殊字符作为密钥,没有机会引入漏洞。

然而,在我看来,它使代码的可读性降低,并且更容易因错误地键入一个键而出错,并且花费无数的时间来发现您应该键入

$myKey['name=guitar price=200.00']

代替:

$myKey['name=gutiar price=200.00']

PHP手册页详细解释了为什么这是一个不好的做法:

在将来的某个时候,PHP团队可能想要添加另一个常量或关键字,或者其他代码中的常量可能会干扰。例如,以这种方式使用单词empty和default已经是错误的,因为它们是保留关键字。
http://php.net/manual/en/language.types.array.php

我会说是的,这是不好的做法,但它工作。无论你想达到什么目的,都可以用不同的方式来实现。我可以建议使用多维数组吗?或者一个键和一个值?

我想这样的事情可能会让人头疼。在我看来,更多的拼写错误的空间。而且它看起来不太好看。

请记住,我指的是你的例子。
array('toaster oven' => 100, 'heater' => 50);

关于最佳实践,可读性和实用性应该是主要考虑的问题。如果数组键中的空格使代码可读,那么可以随意使用它们。整篇文章可以用作数组键,但这并不实用。

我不建议使用空格,如果你打算创建可变变量,使用数组键作为变量名-同样适用于使用extract()。当使用不受控制的数据(例如用户输入)时,这可能是危险的,所以要小心。

如果您打算创建可变变量,仍然可以使用

空格,只需事先将空格转换为下划线。

变量的来源:https://www.php.net/manual/en/language.variables.variable.php

extract()来源:https://www.php.net/manual/en/function.extract.php