【问题标题】:json output convert to php stringjson输出转换为php字符串
【发布时间】:2015-07-18 15:46:27
【问题描述】:

下面是我的工作 api,但 "echo $data" 的结果只有 "array""echo $data["data"]["operatorid"]" 没有什么屏幕会变黑。那么如何将json reponse 转换为php 字符串并从中获取特定值

$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"X-Mashape-Key: XXXXXXXX"               
)
);

$context = stream_context_create($opts);
$res = file_get_contents('https://tariff-plan-api-datayuge.p.mashape.com/index.php?circleid=kerala&limit=50&operatorid=BSNL&recharge_type=top', false, $context);
$data = (json_decode($res, true));
echo $data["data"]["operatorid"];

json 响应:

{
"data": [
{
  "id": "3148",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "150",
  "recharge_talktime": "150",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 150 By BSNL",
  "recharge_longdesc": "Full Talktime (offer valid upto 23 Mar 2015)",
  "recharge_type": "Full Talktime"
},
{
  "id": "3149",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "250",
  "recharge_talktime": "250",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 250 By BSNL",
  "recharge_longdesc": "Full Talktime (offer valid upto 23 Mar 2015)",
  "recharge_type": "Full Talktime"
},
{
  "id": "3150",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "550",
  "recharge_talktime": "550",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 550 By BSNL",
  "recharge_longdesc": "Full Talktime (offer valid upto 23 Mar 2015)",
  "recharge_type": "Full Talktime"
},
{
  "id": "3151",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "1000",
  "recharge_talktime": "1100",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 1000 By BSNL",
  "recharge_longdesc": "Extra Talktime (offer is valid till 23 Mar 2015)",
  "recharge_type": "Full Talktime"
},
{
  "id": "3152",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "1100",
  "recharge_talktime": "1210",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 1100 By BSNL",
  "recharge_longdesc": "Extra Talktime (offer is valid till 23 Mar 2015)",
  "recharge_type": "Full Talktime"
},
{
  "id": "3153",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "1500",
  "recharge_talktime": "1650",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 1500 By BSNL",
  "recharge_longdesc": "Extra Talktime (offer is valid till 23 Mar 2015)",
  "recharge_type": "Full Talktime"
},
{
  "id": "3154",
  "operatorid": "BSNL",
  "circleid": "Kerala",
  "recharge_amount": "2000",
  "recharge_talktime": "2200",
  "recharge_validity": "Unlimited",
  "recharge_shortdesc": "Recharge Of Rs 2000 By BSNL",
  "recharge_longdesc": "Extra Talktime (offer is valid till 23 Mar 2015)",
  "recharge_type": "Full Talktime"
}
]

【问题讨论】:

  • echo $data["data"][0]["operatorid"] 输出什么?您在“数据”中有多个数组,因此您需要引用其中之一。
  • echo $data["data"][0]["operatorid"];
  • 感谢@maxxi 和 splash58

标签: php json mashup


【解决方案1】:

该 JSON 字符串转换为一个 PHP 对象,该对象具有一个名为 data 的属性,它是一个对象数组

来自print_r()的输出

stdClass Object
(
    [data] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 3148
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 150
                    [recharge_talktime] => 150
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 150 By BSNL
                    [recharge_longdesc] => Full Talktime (offer valid upto 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

            [1] => stdClass Object
                (
                    [id] => 3149
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 250
                    [recharge_talktime] => 250
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 250 By BSNL
                    [recharge_longdesc] => Full Talktime (offer valid upto 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

            [2] => stdClass Object
                (
                    [id] => 3150
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 550
                    [recharge_talktime] => 550
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 550 By BSNL
                    [recharge_longdesc] => Full Talktime (offer valid upto 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

            [3] => stdClass Object
                (
                    [id] => 3151
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 1000
                    [recharge_talktime] => 1100
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 1000 By BSNL
                    [recharge_longdesc] => Extra Talktime (offer is valid till 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

            [4] => stdClass Object
                (
                    [id] => 3152
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 1100
                    [recharge_talktime] => 1210
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 1100 By BSNL
                    [recharge_longdesc] => Extra Talktime (offer is valid till 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

            [5] => stdClass Object
                (
                    [id] => 3153
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 1500
                    [recharge_talktime] => 1650
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 1500 By BSNL
                    [recharge_longdesc] => Extra Talktime (offer is valid till 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

            [6] => stdClass Object
                (
                    [id] => 3154
                    [operatorid] => BSNL
                    [circleid] => Kerala
                    [recharge_amount] => 2000
                    [recharge_talktime] => 2200
                    [recharge_validity] => Unlimited
                    [recharge_shortdesc] => Recharge Of Rs 2000 By BSNL
                    [recharge_longdesc] => Extra Talktime (offer is valid till 23 Mar 2015)
                    [recharge_type] => Full Talktime
                )

        )

)

所以要引用单个项目,您需要使用此语法

$context = stream_context_create($opts);
$res = file_get_contents('https://tariff-plan-api-datayuge.p.mashape.com/index.php?circleid=kerala&limit=50&operatorid=BSNL&recharge_type=top', false, $context);

$data = (json_decode($res));
echo $data->data[0]->operatorid;

如果使用$data以外的变量名可能会更容易理解所以

$jsonObj = (json_decode($res));
echo $jsonObj -> data[0] -> operatorid;

或者,如果您正在处理所有事件

$jsonObj = (json_decode($res));
foreach ($jsonObj -> data as $data) {
    echo $data -> operatorid;
}

【讨论】:

    【解决方案2】:

    $data 拥有一个多维数组 - “数据”,它本身拥有多个数组。

    echo $data["data"]["operatorid"] 不会返回任何内容,因为您没有指定要从哪些数组中打印operatorid

    使用以下内容指定您要定位的数组

    $data["data"][*index*]["operatorid"]

    或者像这样遍历你的 $data 数组

    foreach( $data as $Adata ){
        foreach( $Adata as $arr ){
            echo $arr['operatorid'];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多