-2
<?php
error_reporting(-1);
$a = array('key' => '2');
$a = $a['key'];
var_dump($a);
echo $a['key'], "\n";
?>

我希望代码抛出空字符串或警告说密钥不存在,但代码打印 2;

PHP 5.3.10-1

更新 1:添加 var_dump 和 error_reporting。

输出是

hari@hari-laptop:~$ php run.php  
string(1) "2"  
2  
4

2 回答 2

6

$a是一个保存值的字符串"2"

PHP 中的字符串可以被索引以使用方括号访问它们的字符。例如:

$a = "abcde";
echo $a[3];  // This will print 'd'

当索引是字符串时,PHP 会尝试将其解析为整数。如果字符串不是数字,解析将给出0. 因此,使用第零个索引,表示第一个字符。(在 PHP 5.4 及更高版本中,它会发出警告)。在您的情况下,您得到“2”,因为$a['any_stuff']= 第一个字符 ='2'

来自PHP 手册

按字符访问和修改字符串

字符串中的字符可以通过使用方数组括号指定字符串后所需字符的从零开始的偏移量来访问和修改,如$str[42]. 为此,将字符串视为字符数组。当您想要提取或替换超过 1 个字符时substr(), 可以使用这些功能。substr_replace()

从 PHP 5.4 开始,字符串偏移量必须是整数或类似整数的字符串,否则会抛出警告。

于 2012-11-08T05:24:24.357 回答
1

如果您为 选择不同的值,这将更有意义$a['key']

$a = array('key' => 'whatever');
$a = $a['key'];
var_dump($a);
echo $a['key'], "\n";

输出是:

string(8) "whatever"
w

首先,该echo命令实际上并不是一个函数,而是一种语言结构。括号是可选的。

其次,当您有一个作为数组访问的字符串时,PHP 将该字符串视为一个字符数组。但是如果你传递了一个无效的密钥,那么你会得到第一个字符。

echo $a[0];    // w
echo $a[1];    // h
echo $a[2];    // a
echo $a[3];    // t
echo $a['invalid_key'];    // w
于 2012-11-08T05:40:15.227 回答