基于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 相关文章推荐
Zend公司全球首推PHP认证
Oct 09 PHP
php htmlspecialchars加强版
Feb 16 PHP
关于zend studio 出现乱码问题的总结
Jun 23 PHP
注意:php5.4删除了session_unregister函数
Aug 05 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
Yii2如何批量添加数据
May 17 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 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
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
微信小程序  action-sheet详解及实例代码
2016/11/09 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
python保存数据到本地文件的方法
2018/06/23 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
python中return的返回和执行实例
2019/12/24 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
业务副厂长岗位职责
2014/01/03 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
本科生就业推荐信
2014/05/19 职场文书
理发店策划方案
2014/06/05 职场文书
毕业证委托书范文
2014/09/26 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
个人职业及收入证明
2014/10/13 职场文书
校本课程教学计划
2015/01/19 职场文书
详解python字符串驻留技术
2021/05/21 Python