早上看到 SO 上一个有关 PHP 的问题,提问者描述有一个数组,使用 print_r 可以看到索引 key 和相对应的 value 都是存在的,但是访问该元素,不管是使用 array[key] 还是 array[‘key’] 这两种访问形式,都提示 Undefined offset 而取不到数据。举例描述提问者的问题,假设一个数组 $a,print_r($a) 的输出为

可以看到数组存在索引 1 值为 foo,当使用 $a[1] 或者 $a[‘1’] 访问索引为 1 的元素,都提示 Undefined offset,这就有点让人费解了,下文将讲解这个问题产生的原因,以及如何得到像这样奇怪的一个数组。

首先说明一点,PHP 中数组的 key 可以为整形和字符串,但是包含有合法整型值的字符串会被转换为整型。例如键名 “1” 实际会被储存为 1。来看一个例子,考虑如下代码:

1

2

3

4

5

6

7

$a=array(

1=>‘foo‘,

‘1‘=>‘bar‘,

‘name‘=>‘upliu‘,

);

print_r($a);

var_dump($a);

将会输出:

可以看到存入到数组里面的 1 为数值索引(注意索引 name 加了引号,说明索引 name 为字符串索引(这不废话嘛,’name’ 肯定是字符串啊)),并且值为 bar 覆盖了先出现的 foo,$a[1] 和 $a[‘1’] 都能正确读取到 bar,且没有任何错误警告提示,说明这个两者都是可用的(笔者在此猜测 $a[‘1’] 实际上完全等效于 $a[1],PHP 数组读取元素的时候会将数值字符串索引转换为数值索引)。

我们先还原一下提问者的问题,看如何生产出那样一个数组。考虑如下代码:

1

2

3

$json=‘{"1":"foo"}‘;

$o=json_decode($json);

var_dump($o);

将会输出

这个结果很显而易见,$o 为一个对象,有一个属性为 1,因为该属性并不是合法的 PHP 标识符,因此不能使用箭头的方式访问,我们使用强制类型转换将该对象转换为一个数组:

1

2

$a=(array)$o;

print_r($a);

将会输出

接下来尝试访问数组 $a 的索引为 1 的元素:

1

2

echo$a[1],PHP_EOL;

echo$a[‘1‘],PHP_EOL;

上面两条语句均会报错 Undefined offset,这时数组 $a 就是 SO 上那位提问者遇到问题时碰到的数组了,BUG 重现是一件很爽的事啊。

我们来直接将上面代码中的 json 串解析为数组:

1

2

3

4

$a2=json_decode($json,true);

print_r($a2);

echo$a2[1],PHP_EOL;

echo$a2[‘1‘],PHP_EOL;

将会输出

一切正常,这个时候问题来了,明明数组 $a 和数组 $a2 使用 print_r 输出一模一样,为什么一个元素可以访问,另一个却不能访问。我们用更强大的 var_dump 看看:

1

2

var_dump($a);

var_dump($a2);

将会输出

从这个输出我们可以看到数组 $a 和 $a2 的不同,通过将对象强制类型转换得到的数组 $a 拥有一个字符串 ‘1’ 的索引(可以使用 var_dump(array_keys($a))来证实这一点),而我们使用 $a[1] 和 $a[‘1’] 都是访问数组 $a 中索引为 1 的元素,而 $a 并不存在该元素,因此出现错误 Undefined offset。

小结:PHP 默认不会存储整型字符串的索引,会将其转换为数值,在将对象转换为数组的过程中可能引入整型字符串的索引,如果给出索引为整数或整形字符串,访问数组元素都会去获取数组的对应数值索引。

本文实例完整代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

$json=‘{"1":"foo"}‘;

$o=json_decode($json);

$a=(array)$o;

print_r($a);

echo$a[1],PHP_EOL;

echo$a[‘1‘],PHP_EOL;

$a2=json_decode($json,true);

print_r($a2);

echo$a2[1],PHP_EOL;

echo$a2[‘1‘],PHP_EOL;

var_dump($a);

var_dump($a2);

var_dump(array_keys($a));

var_dump(array_keys($a2));

foreach($a2 as$k=>$v){

var_dump($k);

var_dump($v);

}

foreach($aas$k=>$v){

var_dump($k);

var_dump($v);

}

--本文来源于网络

原文:http://www.cnblogs.com/kl0428/p/6394831.html

php中获取不到当前元素,PHP 中数组获取不到元素相关推荐

  1. java 数组中差值最大数对,[算法题] 求数组有序后相邻元素之间的最大差值

    1. 题目要求 给定无序数组(此数组是long类型的数组,但以下示例只列一些小一点的数),例如: [3, 1, 12, 9, 3, 7, 1, 4, 7, 8, 10] 求数组有序后相邻元素之间的最大 ...

  2. c语言数组添加字符元素,C语言数组添加和删除元素的实现

    数组不擅长插入(添加)和删除元素.数组的优点在于它是连续的,所以查找数据速度很快.但这也是它的一个缺点.正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移:而删除一个元素时,删除 ...

  3. php删除数组指定的元素,php删除数组中指定值的元素的几种方法

    php删除数组中指定值的元素的几种方法 发布时间:2020-11-11 10:44:07 来源:亿速云 阅读:102 作者:小新 这篇文章主要介绍php删除数组中指定值的元素的几种方法,文中介绍的非常 ...

  4. php根据键值去除数组中的某个元素_php删除数组中指定值的元素的几种方法

    在一些特殊情况下,你需要删除数组中的特定值,而且要全部删除,其实方法有很多种,我们通过本文来进行讨论. 一.利用foreach和unset()函数删除数组中的特定元素 foreach($array a ...

  5. 如何给6个整数的一维数组某个元素赋值_数组指针详解

    文章部分资料来源: Pointer to an Array | Array Pointer - GeeksforGeeks​www.geeksforgeeks.org 介绍数组指针之前,先来回顾指针: ...

  6. js 数组移除指定元素【函数封装】(含对象数组移除指定元素)

    普通数组移除指定元素 // 普通数组移除指定元素 function removeItem(arr, item) {let targetIndex = arr.findIndex((itemTemp) ...

  7. js删除数组里的某个元素

    JavaScript中如何删除数组某个元素,我们有需要了解splice这个方法,翻译为剪接,arr.splice(0,1)表示删除数组的第一个,arr.splice(1,2)表示删除从第二个开始,长度 ...

  8. 算法训练 - P1101 ——有一份提货单,其数据项目有:商品名(MC)、单价(DJ)、数量(SL)。定义一个结构体prut,其成员是上面的三项数据。在主函数中定义一个prut类型的结构体数组,输入每

    问题描述 有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输 ...

  9. python列表取出元素_python中的列表,添加元素,获取元素,删除元素,列表分片,常用操作符...

    一. 创建列表,分为创建普通列表,混合列表,和空列表.其中混合列表是指string,int, float等都可以写在同一个列表里,空列表是指列表可以为空 二. 在列表添加成员方法 1. append( ...

  10. ref获取元素 vue 删除子元素_vue中的 ref 和 $refs

    相信前端开发或者后端开发都用过jquery,因为不是数据驱动,为了获取某些元素的value值,都操作过Dom元素. // 使用Jquery获取Dom元素值$("#id").text ...

最新文章

  1. [English20091217]英语口语444句
  2. [JavaScript]JS由来
  3. 第三次学JAVA再学不好就吃翔(part50)--String类练习
  4. XML —— DTD介绍
  5. define 字符串_C++如何使用define关键字以便使用中文编程?
  6. VSRE的完整形式是什么?
  7. 【C语言】输入三个正整数a,b,c,求最大值,要求定义一个计算最大值的函数max(a,b),返回a,b的值...
  8. jQuery自动完成点击html元素
  9. Kafka、RabbitMQ、RocketMQ比较
  10. 封装特效记录--持续更新
  11. html博客网页代码_Python自动化运维系列:Django搭建个人博客之前端篇
  12. python csv文件比较
  13. cad转dxf格式文件太大_DWG格式怎么转换成DXF格式?实测好用的转换工具都在这了...
  14. smart原则_绩效指标如何设定?SMART原则轻松搞定
  15. 第一章-网络安全行业
  16. git pull报错 Can‘t update no tracked branch
  17. 自动化有道云笔记自动签到+看广告奖励
  18. CiteSpace分析专利概况
  19. 人工智能技术应用的领域主要有哪些?
  20. PAT 1010 月饼

热门文章

  1. ASCII、Unicode、GBK和UTF-8字符编码的区别联系[转]
  2. maven常用插件: 打包源码 / 跳过测试 / 单独打包依赖项
  3. yii模版中的判断方法
  4. 改变Oracle 默认显示格式
  5. let,with,run,apply,also函数区别
  6. json mysql乱码问题_读写json中文ASCII乱码问题的解决方法
  7. 三宝小精灵机器人_三宝小精灵幼育机器人-引领幼教AI新浪潮
  8. c# 中的除法运算需要注意
  9. mysql 中 where条件的OR 和 and 加括号的说法
  10. 如何让网站自动识别手机端与PC端