基于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 上传文件大小限制
Jul 05 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
浅谈php7的重大新特性
Oct 23 PHP
php实用代码片段整理
Nov 12 PHP
php实现基于PDO的预处理示例
Mar 28 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
ecshop添加菜单及权限分配问题
Nov 21 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在Web开发领域的优势
2006/10/09 PHP
用文本文件制作留言板提示(上)
2006/10/09 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
SVG实现时钟效果
2018/07/17 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
图解Python中深浅copy(通俗易懂)
2020/09/03 Python
CSS3教程(4):网页边框和网页文字阴影
2009/04/02 HTML / CSS
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
九州传奇上机题
2014/07/10 面试题
营销人才自我鉴定范文
2013/12/25 职场文书
争先创优活动总结
2014/08/27 职场文书
2014年项目工作总结
2014/11/24 职场文书
先进集体申报材料
2014/12/25 职场文书
校本培训个人总结
2015/02/28 职场文书
妇产科护理心得体会
2016/01/22 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL