作者tkdmaf (皮皮快跑)
看板PHP
标题Re: [请益] PHP抓json後使用foreach问题
时间Wed Nov 2 10:15:35 2016
※ 引述《yongb (火系见习魔法师 )》之铭言:
: 最近用PHP玩json的时候发现
: 要使用foreach的时候居然无法回圈列出
: 以下是code
: <?php
: 1 $json='
: 2 {
: 3 "test":[
: 4 {
: 5 "pid":34,
: 6 "name":cat
: 7 },
: 8 {
: 9 "pid":35,
: 10 "name":dog
: 11 }
: 12 ]
: 13 }';
: 14
: 15 $testjson=json_decode($json);
: 16 echo $testjson->test[0]->pid."<br/>";
: 17 foreach($testjson as $key =>$value){
: 18 $value[0]->pid;
: 19 }
: ?>
: 一开始15行传到testjson是物件
: 可是当使用foreach後传到$value的时候就变成一种奇怪的状态
: 用var_dump看了一下
: 似乎是物件在阵列里面?
: 更让我惊讶的是$key里面居然是test冏
: 然後pid只跑出一笔,可是不$value[0]又会错误,被那个test卡着
: 我查了一下有两个解决方式
: 1.改15行的json_decode($json,true)直接变成阵列
: 可是我又很不想用阵列
: 2.使用for回圈但看起来好丑,也不太想用
: 各位大大有别的思路吗? 小弟在此先谢过
{"key":"value"}
(像我用的swift语言则是["key":"value"],是不是长得比较像阵列了?)
稍微来谈谈这个好了。
在php叫做hash table
在javascript叫做object
在python、object-c、swift之类的叫做dictionary
(对,在php的书很多都告诉你这叫array,事实上却是和array混在一起使用了。
在其他的语言array和dictionary在定义型态时可是分开来的。)
因为php在「定义」上,只有object和array两种东西。
事实上key/value如果是要定义在dictionary的话,是比较接近阵列而不是物件。
因为物件的话本身还会有「方法」和「属性」这二件事。
而事实上在json格式中如果定义方法那是不对的。
定义了方法就不是json而是物件。
但是一个不能定义方法的东西,就不应该使用物件的方式来处理。
这完全就不是你想不想用……而是你必须那样使用。
(以及…事实上在php中处理array的速度比处理object还快一些)
既然那是最佳的解决问题途迳,就不要用个人的喜好来硬要用别的方式解。
否则只是累死自己而已。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.204.164.110
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1478052939.A.E3C.html
1F:推 yongb: 感谢大大听你这样一说,尤其这句定义了方法就不是json 11/02 17:36
2F:→ yongb: 而是物件,突然不知道我前面再坚持甚麽,既然这是最佳的问 11/02 17:37
3F:→ yongb: 提解决办法 11/02 17:37
4F:推 rickysu: 这边小小勘误一下,在PHP这个叫作Associative Array 11/03 09:21
5F:→ rickysu: 另外一个以数字作为key的称为Index Array 11/03 09:21
6F:→ rickysu: 在底层Object跟Array的储存都是用Hashtable效能上 11/03 09:26
7F:→ rickysu: 是等价的,也因为如此才有办法对 Object 作 foreach 11/03 09:27
8F:推 yongb: 我得先理解hashtable... 11/03 22:49