基于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 相关文章推荐
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
PHP命名空间用法实例分析
Sep 04 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
Javascript实例教程(19) 使用HoTMetal(3)
2006/12/23 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
Python入门篇之函数
2014/10/20 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
Python unittest模块用法实例分析
2018/05/25 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
Python threading的使用方法解析
2019/08/28 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
python import 上级目录的导入
2020/11/03 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
优秀共产党员先进事迹
2014/01/27 职场文书
献爱心倡议书
2014/04/14 职场文书
志愿者工作心得体会
2016/01/15 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS