基于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来写记数器(详细介绍)
Oct 09 PHP
关于文本留言本的分页代码
Oct 09 PHP
php在线生成ico文件的代码
Oct 09 PHP
PHP5+UTF8多文件上传类
Oct 17 PHP
php学习笔记之 函数声明
Jun 09 PHP
php中邮箱地址正则表达式实现与详解
Apr 24 PHP
php支持断点续传、分块下载的类
May 02 PHP
php抽奖概率算法(刮刮卡,大转盘)
Apr 17 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
Jun 24 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 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分页显示制作详细讲解
2006/10/09 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
接收键盘指令的脚本
2006/06/26 Javascript
深入认识JavaScript中的函数
2007/01/22 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
Python with用法实例
2015/04/14 Python
快速了解python leveldb
2018/01/18 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
Python中bisect的使用方法
2019/12/31 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
日本钓鱼渔具和户外用品网上商店:naturum
2016/08/07 全球购物
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
怎样声明一个匿名的内部类
2016/06/01 面试题
超市营业员求职简历的自我评价
2013/10/17 职场文书
学前班教师的自我鉴定
2013/12/05 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
荆州古城导游词
2015/02/06 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书