You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:22