PHP如何针对JSON解码对象用字符串作为switch判断条件
如何用字符串作为case实现switch判断JSON解析后的对象数据
初始代码
JSON解析部分
$json = ' { "type": { "image" : [ {"data" : "PNG"} ], "title" : [ {"value" : "OJKAOSKAOSK"} ], "text" : [ {"value" : "asdsada"} ] } }'; $form = json_decode($json);
问题中的switch代码
foreach ($form as $type) { print_r($type->image); switch($type) { case 'image': echo 'image_data'; break; case 'text' : print_r('text_value'); break; case 'title' : print_r('title_value'); break; default: print_r('none'); break; } }
问题分析
你现在的问题核心是foreach遍历的对象不对:
$form是解析后的对象,它只有一个属性type,所以foreach ($form as $type)里的$type其实是$form->type这个子对象,而不是你想要的image、text这类字符串键名。- 用
switch($type)去判断一个对象和字符串是否相等,自然永远走default分支。
解决方案
要实现用字符串作为case的判断,你需要遍历$form->type的键值对,拿到每个类型的字符串键名,再用这个键名做switch判断。这里有两种实用方式:
方式1:将对象转为数组后遍历
// 先把$form->type对象转为关联数组 $typeItems = get_object_vars($form->type); // 遍历键名和对应的值 foreach ($typeItems as $key => $value) { switch($key) { case 'image': echo 'image_data: '; print_r($value); // 输出[{"data":"PNG"}] break; case 'text': echo 'text_value: ' . $value[0]['value']; // 直接取出文本值asdsada break; case 'title': echo 'title_value: ' . $value[0]['value']; // 直接取出标题值OJKAOSKAOSK break; default: print_r('none'); break; } echo '<br>'; // 换行方便查看结果 }
方式2:直接遍历对象的公共属性
PHP支持直接遍历对象的公共属性,不需要转数组,写法更简洁:
foreach ($form->type as $key => $value) { switch($key) { case 'image': echo 'image_data: ' . $value[0]->data; // 用对象方式访问属性 break; case 'text': echo 'text_value: ' . $value[0]->value; break; case 'title': echo 'title_value: ' . $value[0]->value; break; default: echo 'none'; break; } echo '<br>'; }
补充说明
- 你的JSON里
image、text、title对应的都是数组结构(比如[{"data":"PNG"}]),所以访问内部值时要加[0]取数组里的第一个对象,再访问对应的属性。 - 如果想让
json_decode直接返回数组而非对象,可以添加第二个参数true:$form = json_decode($json, true);,后续就可以用数组方式访问(比如$form['type']['image'][0]['data']),遍历和判断逻辑完全通用。
内容的提问来源于stack exchange,提问作者GGw
相关产品推荐
相关产品推荐

