任何人都可以解释这个PHP代码?

时间:2012-11-08 05:15:34

标签: php arrays

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

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

PHP 5.3.10-1

Update1:​​添加var_dump和error_reporting。

输出

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

2 个答案:

答案 0 :(得分:6)

$a是一个包含值"2"的字符串。

可以使用方括号将PHP中的字符串编入索引以访问其字符。例如:

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

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

来自PHP manual

  

按字符串访问和修改字符串

     

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

     

从PHP 5.4开始,字符串偏移必须是整数或类似整数的字符串,否则将引发警告。

答案 1 :(得分: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