基于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添加MySQL数据记录代码
Jun 07 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
Jul 04 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
PHP的Socket网络编程入门指引
Aug 11 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP使用pdo实现事务处理操作示例
Sep 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
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
RequireJs的使用详解
2017/02/19 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
python缩进区别分析
2014/02/15 Python
Python与Redis的连接教程
2015/04/22 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
便捷提取python导入包的属性方法
2018/10/15 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
PHP统计代码行数的小代码
2019/09/19 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
职业教育毕业生求职信
2013/11/09 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
找工作求职信
2014/07/07 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
中小学生学籍证明
2014/10/25 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
深入理解go slice结构
2021/09/15 Golang