2014-12-05 53 views
2

我知道,通过将sting分配给变量,可以通过将变量用作索引数组来表示单个字符,但为什么下面的代码,使用关联数组,不仅仅是因为需要缺少而死亡?为什么'isset'不会在一个肯定不存在的数组键上抛出FALSE?php变量,字符串和数组:关联数组返回字符串的第一个字母

unset($a); 

$a = 'TESTSTRING'; 

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

上面的例子将输出:

string(1) "T" 

编辑:

正如耶勒凯泽表示,这可能是比较安全的事:

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 2014-12-05 16:56:42

回答

2

什么PHP是正在使用您的字符串作为一个数字索引做。在这种情况下,'anystring'相当于0。您可以通过执行

<?php 
echo (int)'anystring'; 
// 0 
var_dump('anystring' == 0); 
// bool(true) 

PHP测试这个做了很多type juggling,这可能会导致“有趣”的结果。

+0

Aha。这是我正在寻找的。谢谢。 – dgig 2014-12-05 16:54:55

1

$ a是一个不是关联数组的字符串。

如果你想以这种方式访问​​它,你必须做这样的事情。

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

这不是我试图访问它。我知道如何工作。这是我猜想的更抽象的问题。我把$ a设置为一个字符串,并且可以预料,错误地证明isset($ a ['anysting'])是FALSE,因为我从来没有设置它。但它返回true。我只是不明白这个机制。 – dgig 2014-12-05 16:53:22

0

尝试启用PHP使用error_reporting(E_ALL);

这应该给你一个警告,说你正在使用非法偏移,以显示所有错误。因此,PHP会自动假定您正在查找数组或字母中的第一个元素。

+0

我试过了,没有发出警告或通知。 – dgig 2014-12-05 16:54:04

+0

如果我复制并粘贴到Netbeans中,我会得到一个非法的偏移错误。这主要是因为只有在使用'$ a'作为数组时才能使用整数键。你是在一个完全空白的文件中写这个吗? – AnotherGuy 2014-12-05 16:56:44

+0

是的,它只是一个空的PHP文件。有趣的是,netbeans会做一些额外的检查。 – dgig 2014-12-05 16:58:06

1

您需要使用array_key_exists()来测试是否有键存在

+0

这是一个很好的观点。我将来会这样做。在处理关联数组时,它看起来像“isset”不会总是给出预期的结果。 Thx – dgig 2014-12-05 16:56:54

1

isset的工作在你的情况下是正确的。 因为$a是一个字符串,所以index-operator会在声明的位置给你指定的字符串。 (如“字符阵”)

一个小例子:

$a = 'TESTSTRING'; 
echo $a[0]; // Output: T 
echo $a[1]; // Output: E 
// ... 

这将输出第一和索引0和字符串的1的第二个字符。

而且因为索引运算符总是期望字符串的整数值。给定的值将被自动转换为一个整数。你可以看到这一点,当你投的字符串为整数,如:

echo (int) 'TESTSTRING'; // Output: 0 

对于char-访问的字符串,也see the PHP-Manual

0

它按预期的方式工作......它返回false ...但是当我强制它返回true时itz会抛出一个错误说非法偏移somekind ....但仍然输出第一个字符串... 。因为anstring铸造为int等于0 ..检查您使用的兄弟的PHP版本...我用记事本++创建php文件...没有特殊的ide ...

相关问题