json - 如何看待/纠正php的array_key_exists函数bug?
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
不能说这是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 also
return TRUE if key is a property defined within an object given as
array. This behaviour should not be relied upon, and care should be
taken to ensure that array is an array. To check whether a property
exists in an object, use property_exists().
http://php.net/manual/en/language.types.object.php#language.types.object.casting
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>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、
