如何用json_encode将PHP嵌套数组转为外层数组内的JSON对象
解决PHP数组转JSON时将子索引数组转为对象的问题
你遇到的问题是因为PHP的json_encode()默认会把连续数字索引且从0开始的数组编码成JSON数组,而你需要把每个子数组转成JSON对象。这里有两种简单的解决方法:
方法1:将每个子数组强制转换为对象
在定义数组时,用(object)把每个子索引数组转为PHP对象,这样json_encode()就会把它们编码成JSON对象:
$myAssocArray = array( (object) ['fred','tyson',23], (object) ['collins', 'white', 54], (object) ['mary', 'frost', 46] ); $jsonString = json_encode($myAssocArray); echo $jsonString;
执行后输出的结果就是你期望的:
[{"0":"fred","1":"tyson","2":23},{"0":"collins","1":"white","2":54},{"0":"mary","1":"frost","2":46}]
方法2:使用JSON_FORCE_OBJECT选项(注意外层结构变化)
如果你想让所有数组都转为JSON对象,可以用JSON_FORCE_OBJECT参数,但这样外层的数组也会变成JSON对象(键为0、1、2):
$myAssocArray = array( ['fred','tyson',23], ['collins', 'white', 54], ['mary', 'frost', 46] ); $jsonString = json_encode($myAssocArray, JSON_FORCE_OBJECT); echo $jsonString;
输出结果会是:
{"0":{"0":"fred","1":"tyson","2":23},"1":{"0":"collins","1":"white","2":54},"2":{"0":"mary","1":"frost","2":46}}
如果你的需求是外层保持数组、内层是对象,方法1是更合适的选择。
原理说明
PHP中,json_encode()会根据数组类型判断编码方式:
- 当数组是「连续数字索引(从0开始)」时,编码为JSON数组
- 当数组是「关联数组」或「PHP对象」时,编码为JSON对象
把子数组强制转为对象后,就会触发后者的编码逻辑,得到你想要的结构。
内容的提问来源于stack exchange,提问作者Winnipass
相关产品推荐
相关产品推荐

