php变量、字符串和数组:关联数组返回字符串的第一个字母
我知道,如果给变量分配了一个sting,那么可以通过将变量用作索引数组来表示单个字符,但是为什么下面的代码使用关联数组,而不仅仅是因为缺少必需的字符而消失呢?为什么“isset”不会对一个绝对不存在的数组键抛出FALSEphp变量、字符串和数组:关联数组返回字符串的第一个字母,php,arrays,associative-array,Php,Arrays,Associative Array,我知道,如果给变量分配了一个sting,那么可以通过将变量用作索引数组来表示单个字符,但是为什么下面的代码使用关联数组,而不仅仅是因为缺少必需的字符而消失呢?为什么“isset”不会对一个绝对不存在的数组键抛出FALSE unset($a); $a = 'TESTSTRING'; if(!isset($a['anystring'])){ die('MISSING REQUIRED'); }else{ var_dump($a['anystring']); } 上述
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'];
}
$a是字符串而不是关联数组 如果你想通过这种方式访问它,你必须这样做
$a['anystring'] = 'TESTSTRING';
尝试使用
error\u reporting(E\u all)使PHP显示所有错误代码>
这会给您一个警告,说明您正在使用非法偏移量。因此,在本例中,PHP自动假定您正在查找数组或字母中的第一个元素。您需要使用array_key_exists()来测试键是否存在。PHP正在使用字符串作为数字索引。在这种情况下,'anystring'
相当于0
。您可以通过执行以下操作来测试这一点
<?php
echo (int)'anystring';
// 0
var_dump('anystring' == 0);
// bool(true)
在您的情况下,isset
的工作是正确的。
因为$a
是一个字符串,索引运算符将在声明的位置为您提供字符串中指定的字符。(类似于“字符数组”)
一个小例子:
$a = 'TESTSTRING';
echo $a[0]; // Output: T
echo $a[1]; // Output: E
// ...
这将在字符串的索引0和1处输出第一个和第二个字符
因为索引操作符总是希望字符串上有一个整数值。给定值将自动转换为整数。当您将字符串强制转换为整数时,可以看到如下所示:
echo (int) 'TESTSTRING'; // Output: 0
对于字符串上的字符访问也是如此。它的工作原理与预期的一样。。。结果是假的。。。但当我强迫它回到真的时候。。。itz抛出了一个错误,称为某种非法偏移。。。。但是仍然输出第一个字符串。。。。作为任意字符串,强制转换为int等于0。。检查您正在使用的php版本bro。。。我使用notepad++创建了php文件。。。没有特殊的ide…我不是在尝试访问它。我知道那是怎么回事。我想这更像是一个抽象的问题。我将$a设置为字符串,并错误地期望isset($a['anysting'])为FALSE,因为我从未设置它。但它又回到了现实。我只是不明白那种机制。啊哈。这就是我要找的。谢谢。有趣的是,只有在4.3.0-4.4.9和5.0.3-5.3.29中,如果我复制并粘贴到Netbeans中,我会得到一个非法的偏移量错误。这主要是因为当使用$a
作为数组时,只能使用整数键。你是在一个完全空白的文件中写的吗?是的,它只是一个空的php文件。有趣的是,netbeans做了一些额外的检查。我在另一个编辑器中再次尝试了这一点。代码中似乎没有错误。我现在得到了预期的结果。这确实很奇怪:这是一个很好的观点。我以后会这样做的。在处理关联数组时,“isset”似乎并不总是给出预期的结果。谢谢