基于php双引号中访问数组元素报错的解决方法


Posted in PHP onFebruary 01, 2018

最近在做微信公众号开发,在一个发送图文接口中,需要把数组元素拼接在XML字符串中

foreach ($itemArr as $key => $value){ 
  $items .= "<item> 
  <Title><![CDATA[$value['title']]]></Title>  
  <Description><![CDATA[[$value['description']]]></Description> 
  <PicUrl><![CDATA[$value['picUrl']]]></PicUrl> 
  <Url><![CDATA[$value['url']]]></Url> 
  </item>"; 
}

结果竟报如下错误信息:

Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in D:\hhp\wamp\www\weixin\wx_sample.php on line 146

从错误信息看是单引号的问题,果断去掉之后就没报错了。然而我就纳闷了,引用下标为字符串的数组元素难道不该加引号吗?到php官方手册去查了关于数组的描述,有一段是这样的:

$arr = array('fruit' => 'apple', 'veggie' => 'carrot'); 
// This will not work, and will result in a parse error, such as: 
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING' 
// This of course applies to using superglobals in strings as well 
print "Hello $arr['fruit']"; 
print "Hello $_GET['foo']";

这里给出了两种错误的写法,当一个普通数组变量或超全局数组变量包含在双引号中时,引用索引为字符串的数组元素,索引字符串不应该再添加单引号。那正确的写法是怎样的呢?于是我继续查找官方手册,找到如下说法:

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// This defines a constant to demonstrate what's going on. The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');

// The following is okay, as it's inside a string. Constants are not looked for// within strings, so no E_NOTICE occurs hereprint "Hello $arr[fruit]";   // Hello apple// With one exception: braces surrounding arrays within strings allows constants// to be interpretedprint "Hello {$arr[fruit]}";  // Hello carrotprint "Hello {$arr['fruit']}"; // Hello apple

$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// This defines a constant to demonstrate what's going on. The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');

// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]";   // Hello apple

// With one exception: braces surrounding arrays within strings allows constants
// to be interpreted
print "Hello {$arr[fruit]}";  // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple

这里给出了三种正确的写法:

第一种写法索引字符串不添加任何引号,此时表示获取索引为字符串fruit的数组元素,输出apple。

第二种写法索引字符串也没有添加任何引号,同时将数组变量用一对花括号{ }给包了起来,此时fruit实际上表示一个常量,而不是一个字符串,因此表示获取索引为fruit常量值的数组元素,常量fruit的值是veggie,所以输出carrot。

第三种写法是引用字符串不但添加了单引号,同时也将数组变量用一对花括号{ }给包了起来,此时表示获取索引为字符串fruit的数组元素,输出apple。

后来我继续查找,发现这样一段代码:

// Incorrect. This works but also throws a PHP error of level E_NOTICE because 
// of an undefined constant named fruit 
//  
// Notice: Use of undefined constant fruit - assumed 'fruit' in... 
print $arr[fruit];  // apple 
<pre name="code" class="php">print $arr['fruit']; // apple
// This defines a constant to demonstrate what's going on. The value 'veggie'// is assigned to a constant named fruit.define('fruit', 'veggie');// Notice the difference nowprint $arr[fruit]; // carrot

print $arr['fruit']; // apple

在正常情况下,数组变量没有被双引号包围时,是否给索引字符串加上单引号输出结果都一致时apple,但是当定义一个与索引字符串fruit同名的常量时,未加单引号的索引字符串输出结果就成了carrot,而加上单引号还是apple。

结论:

1. 数组变量未用双引号包括时,

(1) 索引字符串加单引号表示字符串本身

<pre name="code" class="php">$arr['fruit']

(2)索引字符串未加单引号表示常量,当常量未定义时则解析为字符串,等效于加上单引号。

$arr[fruit]

2. 数组变量用双引号包括时,

(1) 索引字符串不加单引号表示字符串本身

"$arr[fruit]"

(2) 数组变量加上花括号表示与字符串同名常量

"{$arr[fruit]}"

(3) 索引字符串加上单引号且数组变量加上花括号表示字符串本身

<pre name="code" class="php"><pre name="code" class="php">"{$arr['fruit']}"

(4) 索引字符串加上单引号且数组变量未加上花括号,为错误写法,报错:Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'

<pre name="code" class="php"><pre name="code" class="php">"$arr['fruit']"

附:php手册数组说明URL

http://php.net/manual/zh/language.types.array.php

以上这篇基于php双引号中访问数组元素报错的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
php REMOTE_ADDR之获取访客IP的代码
Apr 22 PHP
PHP Pear 安装及使用
Mar 19 PHP
php面向对象全攻略 (十五) 多态的应用
Sep 30 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
简单的cookie计数器实现源码
Jun 07 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 PHP
Thinkphp5.0框架视图view的模板布局用法分析
Oct 12 PHP
laravel 出现command not found问题的解决方案
Oct 23 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 #PHP
PHP双向链表定义与用法示例
Jan 31 #PHP
基于PHP实现的多元线性回归模拟曲线算法
Jan 30 #PHP
PHP 记录访客的浏览信息方法
Jan 29 #PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 #PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
Jan 29 #PHP
PHP 使用二进制保存用户状态的实例
Jan 29 #PHP
You might like
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
浅谈PHP的反射机制
2016/12/15 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python两种遍历字典(dict)的方法比较
2014/05/29 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Python3生成手写体数字方法
2018/01/30 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
法律六进活动方案
2014/03/13 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
大学军训心得体会800字
2016/01/11 职场文书