json - 如何看待/纠正php的array_key_exists函数bug?

php中文网
发布: 2016-06-06 20:22:25
原创
1391人浏览过

array_key_exists(0或'0',json_decode('{"0":0})===false

array_key_exists(0或'0',(object)array(0))===true

不能说这是json_decode的锅,
因为二者var_dump出来虽然一个索引是数字一个是字符串,但是毕竟都存在,而且->{0或'0'}访问没区别。

实在不行当然只能用第三方json函数,然而php中空字符串也不能作为索引,而json规则中并没有这一条。

真的怕了,php坑太无规律,哪天用着用着又可能有新雷。。

回复内容:

array_key_exists(0或'0',json_decode('{"0":0})===false

array_key_exists(0或'0',(object)array(0))===true

立即学习PHP免费学习笔记(深入)”;

不能说这是json_decode的锅,
因为二者var_dump出来虽然一个索引是数字一个是字符串,但是毕竟都存在,而且->{0或'0'}访问没区别。

实在不行当然只能用第三方json函数,然而php中空字符串也不能作为索引,而json规则中并没有这一条。

真的怕了,php坑太无规律,哪天用着用着又可能有新雷。。

RTFM

http://php.net/array_key_exists

For backward compatibility reasons, array_key_exists() will alsoreturn TRUE if key is a property defined within an object given asarray. This behaviour should not be relied upon, and care should betaken to ensure that array is an array. To check whether a propertyexists in an object, use property_exists().

http://php.net/manual/en/language.types.object.php#language.types.object.casting

ListenLeap
ListenLeap

AI辅助通过播客学英语

ListenLeap 101
查看详情 ListenLeap

An array converts to an object with properties named by keys and
corresponding values, with the exception of numeric keys which will be
inaccessible unless iterated.

呃,陆续有人赞这个回答,但是在评论区交流了一番之后觉得一开始的回答是有问题的,感到有些惭愧,所以编辑这个回答

如原答案所说,array_key_exists应该是检查数组中某个key是否存在的,但是由于历史原因,array_key_exists支持第二个参数为对象,但这是一个向下兼容的设计,官方文档建议不要依赖这个实现

This behaviour should not be relied upon, and care should be taken to ensure that array is an array.

题主在评论里提到了json_decode转换为数组之后再转换成json会面临空数组究竟是对应成javascript的空对象还是空数组的问题,也许可以看看json_encode的时候加上 JSON_FORCE_OBJECT 这个选项:

<code>php > echo json_encode([]);
[]
php > echo json_encode([], JSON_FORCE_OBJECT);
{}
php > echo json_encode(['hello,world']);
["hello,world"]
php > echo json_encode(['hello,world'], JSON_FORCE_OBJECT);
{"0":"hello,world"}</code>
登录后复制

不过这个就变成所有的空数组都强制转换为对象了,也不见得就一定好用,怎么用就看题主自己取舍了(或者在js端多加一个额外的判断?)

下面是原回答


json_decode 第二个参数不带的话,返回的是一个对象,根本不是数组

以下是php shell执行结果

<code>php > var_dump(json_decode("{\"0\":0}"));
class stdClass#1 (1) {
  public $0 =>
  int(0)
}
php > var_dump(json_decode("{\"0\":0}", false));
class stdClass#1 (1) {
  public $0 =>
  int(0)
}
php > var_dump(json_decode("{\"0\":0}", true));
array(1) {
  [0] =>
  int(0)
}
php > var_dump(array_key_exists(0, json_decode("{\"0\":0}", true)));
bool(true)
php > var_dump(array_key_exists(0, json_decode("{\"0\":0}", false)));
bool(false)
php > var_dump(array_key_exists('0', json_decode("{\"0\":0}")));
bool(false)</code>
登录后复制
相关标签:
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号