【问题标题】:Parse json into PHP variables将 json 解析为 PHP 变量
【发布时间】:2015-06-18 00:57:02
【问题描述】:

我正在尝试将这个 json 数据解析成一个 php 变量。

[{"type":"browsers","list":[{"key":"mobilesafari","value":3},{"key":"safari","value":1},{"key":"chrome","value":1}],"cardinality":3},{"type":"countries","list":[{"key":"US","value":3},{"key":"KR","value":1},{"key":"BR","value":1}],"cardinality":3},{"type":"languages","list":[{"key":"en-us","value":3},{"key":"pt-br","value":1},{"key":"ko-kr","value":1}],"cardinality":3},{"type":"organisations","list":[{"key":"Williams-Sonoma","value":1},{"key":"Verizon Wireless","value":1},{"key":"SK Telecom","value":1},{"key":"Oi Velox","value":1},{"key":"CenturyLink","value":1}],"cardinality":5},{"type":"platforms","list":[{"key":"iphone","value":2},{"key":"win8","value":1},{"key":"mac108","value":1},{"key":"ipad","value":1}],"cardinality":4}] 

我正在尝试设置它,以便为浏览器、国家/地区等设置一个变量。

我试过

$foo = $json->browsers;

但我猜这不会起作用,因为那不是 var 的名称。

有什么不复杂的方法吗?

谢谢

【问题讨论】:

标签: php json


【解决方案1】:

如 cmets 中所述,您需要先解码 json,使用 json_decode()

$data = json_decode($json);

现在,为了您的数据。这是一个对象数组,这意味着你必须循环它:

foreach($data as $obj) {
    if($obj->type == 'browsers') {
        print_r($obj);
    }
}

Example

【讨论】:

    【解决方案2】:

    使用 json_decode() 但传入第二个参数 true。这样做将返回一个数组而不是一个对象。然后,您可以循环遍历数组以获取每组数据。

    $json = '[{"type":"browsers","list":[{"key":"mobilesafari","value":3},{"key":"safari","value":1},{"key":"chrome","value":1}],"cardinality":3},{"type":"countries","list":[{"key":"US","value":3},{"key":"KR","value":1},{"key":"BR","value":1}],"cardinality":3},{"type":"languages","list":[{"key":"en-us","value":3},{"key":"pt-br","value":1},{"key":"ko-kr","value":1}],"cardinality":3},{"type":"organisations","list":[{"key":"Williams-Sonoma","value":1},{"key":"Verizon Wireless","value":1},{"key":"SK Telecom","value":1},{"key":"Oi Velox","value":1},{"key":"CenturyLink","value":1}],"cardinality":5},{"type":"platforms","list":[{"key":"iphone","value":2},{"key":"win8","value":1},{"key":"mac108","value":1},{"key":"ipad","value":1}],"cardinality":4}]';
    
    foreach(json_decode($json,true) as $arrEachItem){
        switch($arrEachItem['type']){
            case'countries': $arrCountries = $arrEachItem['list']; break;
            case'browsers': $arrBrowsers = $arrEachItem['list']; break;
            case'languages': $arrLanguages = $arrEachItem['list']; break;
            case'organisations': $arrOrganisations = $arrEachItem['list']; break;
            case'platforms': $arrPlatforms = $arrEachItem['list']; break;
        }
    }
    
    //Output each array to the screen
    echo "<pre>";
    print_r($arrCountries);
    print_r($arrBrowsers);
    print_r($arrLanguages);
    print_r($arrOrganisations);
    print_r($arrPlatforms);
    

    【讨论】:

      【解决方案3】:
      $data='[{"type":"browsers","list":[{"key":"mobilesafari","value":3},{"key":"safari","value":1},{"key":"chrome","value":1}],"cardinality":3},{"type":"countries","list":[{"key":"US","value":3},{"key":"KR","value":1},{"key":"BR","value":1}],"cardinality":3},{"type":"languages","list":[{"key":"en-us","value":3},{"key":"pt-br","value":1},{"key":"ko-kr","value":1}],"cardinality":3},{"type":"organisations","list":[{"key":"Williams-Sonoma","value":1},{"key":"Verizon Wireless","value":1},{"key":"SK Telecom","value":1},{"key":"Oi Velox","value":1},{"key":"CenturyLink","value":1}],"cardinality":5},{"type":"platforms","list":[{"key":"iphone","value":2},{"key":"win8","value":1},{"key":"mac108","value":1},{"key":"ipad","value":1}],"cardinality":4}]';
      
      if( !function_exists('pre') ){/* utility function for formatted output - aids debugging */
          function pre( $data ){
              echo '<pre>',print_r( $data, 1 ),'</pre>';
          }
      }
      
      if( !function_exists('createobject') ){
          function createobject( $data=false ){
              try{
                  if( !$data )throw new Exception('Bad value supplied for input data');
      
                  /* decode the supplied data */
                  $json=json_decode( $data );
      
                  /* re-use the variable but reassign as an object */
                  $data=new stdClass;
      
                  /* Iterate through the json data and construct out output object */
                  foreach( $json as $obj ){
                      try{
                          /*
                              A temporary array to store each list item
                              ~ could potentially use `array_map` here
                          */
                          $tmp=new stdClass;
                          foreach( $obj->list as $i => $item ){
                              $tmp->{$item->key}=$item->value;
                          }
      
                          /* Assign new property to output object */
                          $data->{$obj->type}=$tmp;
                      }catch( Exception $e ){
                          continue;
                      }
                  }
                  return $data;
              }catch( Exception $e ){
                  echo $e->getMessage();
              }
          }
      }
      /* To use new object */
      $obj=createobject( $data );
      pre( $obj );
      pre( $obj->browsers );
      pre( $obj->organisations );
      echo $obj->languages->{'en-us'}; //3
      

      这将输出:

      stdClass Object
      (
          [browsers] => stdClass Object
              (
                  [mobilesafari] => 3
                  [safari] => 1
                  [chrome] => 1
              )
      
          [countries] => stdClass Object
              (
                  [US] => 3
                  [KR] => 1
                  [BR] => 1
              )
      
          [languages] => stdClass Object
              (
                  [en-us] => 3
                  [pt-br] => 1
                  [ko-kr] => 1
              )
      
          [organisations] => stdClass Object
              (
                  [Williams-Sonoma] => 1
                  [Verizon Wireless] => 1
                  [SK Telecom] => 1
                  [Oi Velox] => 1
                  [CenturyLink] => 1
              )
      
          [platforms] => stdClass Object
              (
                  [iphone] => 2
                  [win8] => 1
                  [mac108] => 1
                  [ipad] => 1
              )
      
      )
      stdClass Object
      (
          [mobilesafari] => 3
          [safari] => 1
          [chrome] => 1
      )
      stdClass Object
      (
          [Williams-Sonoma] => 1
          [Verizon Wireless] => 1
          [SK Telecom] => 1
          [Oi Velox] => 1
          [CenturyLink] => 1
      )
      3
      

      【讨论】:

        猜你喜欢
        • 2021-11-08
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 2020-06-16
        相关资源
        最近更新 更多