PHP变量、字符串和数组:关联数组返回字符串的第一个字母

3

我知道,将字符串分配给一个变量后,可以使用该变量作为索引数组来表示单个字符,但是为什么下面的代码使用关联数组时不会因为缺少必需项而失败呢?为什么 'isset' 不会在明确不存在的数组键上抛出 FALSE?

unset($a); 

$a = 'TESTSTRING'; 

if(!isset($a['anystring'])){ 
    die('MISSING REQUIRED'); 
}else{ 
    var_dump($a['anystring']);
} 

上面的例子将输出:
string(1) "T"

编辑:

正如Jelle Keiser所指出的那样,这可能是更安全的做法:

if(!array_key_exists('required',$_POST)){ 
    die('MISSING REQUIRED'); 
}else{ 
    echo $_POST['required']; 
} 

2
有趣的是,只有在4.3.0 - 4.4.9和5.0.3 - 5.3.29版本中才能看到此现象。http://3v4l.org/vkgBC - AbraCadaver
6个回答

2

$a是字符串而不是关联数组。

如果你想以那种方式访问它,你需要这样做。

$a['anystring'] = 'TESTSTRING';

并不是我在尝试访问它。我知道那该怎么做。这更像是一个抽象的问题。我将$a设置为字符串,并且期望(错误地)isset($a['anysting'])应该是FALSE,因为我从未设置过它。但它返回true。我只是不理解这个机制。 - dmgig

2
PHP做的是将您的字符串作为数字索引使用。在这种情况下,'anystring'等同于0。您可以通过执行以下操作进行测试:
<?php
echo (int)'anystring';
// 0
var_dump('anystring' == 0);
// bool(true)

PHP进行了很多类型转换,这可能会导致“有趣”的结果。


啊哈,这就是我要找的。谢谢。 - dmgig

1
在您的情况下,isset 的工作是正确的。 因为$a是一个字符串,索引运算符将在声明的位置给出字符串中指定的字符。(就像一个"字符数组")
一个小例子:
$a = 'TESTSTRING'; 
echo $a[0]; // Output: T
echo $a[1]; // Output: E
// ...

这将输出字符串中索引为0和1的第一个和第二个字符。
由于索引运算符始终期望字符串上的整数值。给定的值将自动转换为整数。您可以通过将字符串转换为整数来查看此内容,例如:
echo (int) 'TESTSTRING'; // Output: 0

对于字符串的char访问,也可以查看PHP手册


1

你需要使用array_key_exists()函数来测试一个键是否存在


这是一个很好的观点。我将来会注意到这个问题。在处理关联数组时,“isset”似乎并不总是能给出预期的结果。谢谢。 - dmgig

0

尝试启用PHP以显示所有错误,方法是使用error_reporting(E_ALL);

这样应该会给您一个警告,指出您正在使用非法的偏移量。因此,PHP自动认为您要寻找数组中的第一个元素或在这种情况下的字母。


如果我将此内容复制并粘贴到Netbeans中,会出现非法偏移错误。这主要是因为当使用$a作为数组时,只能使用整数键。您是在完全空白的文件中编写此代码吗? - AnotherGuy
是的,它只是一个空的 PHP 文件。有趣的是 NetBeans 进行了一些额外的检查。 - dmgig
我已经尝试在另一个编辑器中再次尝试了。代码似乎没有错误。我现在得到了预期的结果。这确实很奇怪:D - AnotherGuy

0

它按预期工作...返回false...但是当我强制返回true时...它会抛出一个错误,说是非法偏移...但仍然输出第一个字符串...因为任何字符串转换为整数都等于0...检查一下你使用的PHP版本,兄弟...我用notepad++创建了这个php文件...没有特殊的IDE...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接