Re: [请益] PHP抓json后使用foreach问题

楼主: tkdmaf (皮皮快跑)   2016-11-02 10:15:35
※ 引述《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还快一些)
既然那是最佳的解决问题途迳,就不要用个人的喜好来硬要用别的方式解。
否则只是累死自己而已。
作者: yongb (火系见习魔法师 )   2016-11-02 17:36:00
感谢大大听你这样一说,尤其这句定义了方法就不是json而是物件,突然不知道我前面再坚持什么,既然这是最佳的问提解决办法
作者: rickysu (Ricky)   2016-11-03 09:21:00
这边小小勘误一下,在PHP这个叫作Associative Array另外一个以数字作为key的称为Index Array在底层Object跟Array的储存都是用Hashtable效能上是等价的,也因为如此才有办法对 Object 作 foreach
作者: yongb (火系见习魔法师 )   2016-11-03 22:49:00
我得先理解hashtable...

Links booklink

Contact Us: admin [ a t ] ucptt.com