基于php双引号中访问数组元素报错的解决方法
最近在做微信公众号开发,在一个发送图文接口中,需要把数组元素拼接在XML字符串中
foreach($itemArras$key=>$value){ $items.="- "; }
结果竟报如下错误信息:
Parseerror:syntaxerror,unexpected''(T_ENCAPSED_AND_WHITESPACE),expectingidentifier(T_STRING)orvariable(T_VARIABLE)ornumber(T_NUM_STRING)inD:\hhp\wamp\www\weixin\wx_sample.phponline146
从错误信息看是单引号的问题,果断去掉之后就没报错了。然而我就纳闷了,引用下标为字符串的数组元素难道不该加引号吗?到php官方手册去查了关于数组的描述,有一段是这样的:
$arr=array('fruit'=>'apple','veggie'=>'carrot'); //Thiswillnotwork,andwillresultinaparseerror,suchas: //Parseerror:parseerror,expectingT_STRING'orT_VARIABLE'orT_NUM_STRING' //Thisofcourseappliestousingsuperglobalsinstringsaswell print"Hello$arr['fruit']"; print"Hello$_GET['foo']";
这里给出了两种错误的写法,当一个普通数组变量或超全局数组变量包含在双引号中时,引用索引为字符串的数组元素,索引字符串不应该再添加单引号。那正确的写法是怎样的呢?于是我继续查找官方手册,找到如下说法:
$arr=array('fruit'=>'apple','veggie'=>'carrot'); //Thisdefinesaconstanttodemonstratewhat'sgoingon.Thevalue'veggie' //isassignedtoaconstantnamedfruit. define('fruit','veggie'); //Thefollowingisokay,asit'sinsideastring.Constantsarenotlookedfor//withinstrings,sonoE_NOTICEoccurshereprint"Hello$arr[fruit]";//Helloapple//Withoneexception:bracessurroundingarrayswithinstringsallowsconstants//tobeinterpretedprint"Hello{$arr[fruit]}";//Hellocarrotprint"Hello{$arr['fruit']}";//Helloapple $arr=array('fruit'=>'apple','veggie'=>'carrot'); //Thisdefinesaconstanttodemonstratewhat'sgoingon.Thevalue'veggie' //isassignedtoaconstantnamedfruit. define('fruit','veggie'); //Thefollowingisokay,asit'sinsideastring.Constantsarenotlookedfor //withinstrings,sonoE_NOTICEoccurshere print"Hello$arr[fruit]";//Helloapple //Withoneexception:bracessurroundingarrayswithinstringsallowsconstants //tobeinterpreted print"Hello{$arr[fruit]}";//Hellocarrot print"Hello{$arr['fruit']}";//Helloapple
这里给出了三种正确的写法:
第一种写法索引字符串不添加任何引号,此时表示获取索引为字符串fruit的数组元素,输出apple。
第二种写法索引字符串也没有添加任何引号,同时将数组变量用一对花括号{}给包了起来,此时fruit实际上表示一个常量,而不是一个字符串,因此表示获取索引为fruit常量值的数组元素,常量fruit的值是veggie,所以输出carrot。
第三种写法是引用字符串不但添加了单引号,同时也将数组变量用一对花括号{}给包了起来,此时表示获取索引为字符串fruit的数组元素,输出apple。
后来我继续查找,发现这样一段代码:
//Incorrect.ThisworksbutalsothrowsaPHPerroroflevelE_NOTICEbecause //ofanundefinedconstantnamedfruit // //Notice:Useofundefinedconstantfruit-assumed'fruit'in... print$arr[fruit];//appleprint$arr['fruit'];//apple
//Thisdefinesaconstanttodemonstratewhat'sgoingon.Thevalue'veggie'//isassignedtoaconstantnamedfruit.define('fruit','veggie');//Noticethedifferencenowprint$arr[fruit];//carrot print$arr['fruit'];//apple
在正常情况下,数组变量没有被双引号包围时,是否给索引字符串加上单引号输出结果都一致时apple,但是当定义一个与索引字符串fruit同名的常量时,未加单引号的索引字符串输出结果就成了carrot,而加上单引号还是apple。
结论:
1.数组变量未用双引号包括时,
(1)索引字符串加单引号表示字符串本身
$arr['fruit']
(2)索引字符串未加单引号表示常量,当常量未定义时则解析为字符串,等效于加上单引号。
$arr[fruit]
2.数组变量用双引号包括时,
(1)索引字符串不加单引号表示字符串本身
"$arr[fruit]"
(2)数组变量加上花括号表示与字符串同名常量
"{$arr[fruit]}"
(3)索引字符串加上单引号且数组变量加上花括号表示字符串本身
"{$arr['fruit']}"
(4)索引字符串加上单引号且数组变量未加上花括号,为错误写法,报错:Parseerror:parseerror,expectingT_STRING'orT_VARIABLE'orT_NUM_STRING'
"$arr['fruit']"
附:php手册数组说明URL
http://php.net/manual/zh/language.types.array.php
以上这篇基于php双引号中访问数组元素报错的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。