【问题标题】:JSON decode any value - $var1 = $data['val1']['anyvalue']['val2'];JSON解码任何值 - $var1 = $data['val1']['anyvalue']['val2'];
【发布时间】:2017-04-04 00:21:54
【问题描述】:

我正在为 mySQL 导入提取 JSON 数据,并在我的 JSON 文件的 JSON 解码语句之后设置变量,我正在努力解决一些问题。我的变量设置看起来像这样

$name = $data['available_channels']['3']['name'];

以及像这样的相关 JSON

"available_channels": {
    "3": {
      "num": 152,
      "name": "Sky Sports 3",
      "stream_type": "live",
      "type_name": "Live Streams",
      "stream_id": "3",
      "stream_icon": "http://www.tv-logo.com/pt-data/uploads/images/logo/sky_uk_sports3.jpg",
      "epg_channel_id": "Sky Sports 3",
      "added": "0",
      "category_name": "Sports UK",
      "category_id": "5",
      "series_no": null,
      "live": "1",
      "container_extension": null,
      "custom_sid": ":0:86:EEE:7F2:2:11A0000:0:0:0:",
      "tv_archive": 0,
      "direct_source": "",
      "tv_archive_duration": 0
    },

我的问题是服务的每个频道都以一个新号码开头。所以我需要像这样拉入我的变量,

$name = $data['available_channels']['ANY VALUE HERE']['name'];

有什么想法吗?我知道这一定很简单,我在这里有一个金发碧眼的时刻

谢谢

更新 1

//convert json object to php associative array
    $data = json_decode($jsondata, true);

    //get the values and asign variables
    $name = $data['available_channels']['3']['name'];

更新 2

完整代码

    $data = json_decode($jsonFile, true);
    
    for($i = 0; $i <= count($data['available_channels']); $i++){
    $name = $data['available_channels'][$i]['name'];
    $num = $data['available_channels'][$i]['num'];
    $epg_channel_id = $data['available_channels'][$i]['epg_channel_id'];
    $category_name = $data['available_channels'][$i]['category_name'];
    $stream_icon = $data['available_channels'][$i]['stream_icon'];
    
    //insert into mysql table
    $sql = "INSERT INTO channels(name, num, epg_channel_id, category_name, stream_icon)
    VALUES('$name', '$num', '$epg_channel_id', '$category_name', '$stream_icon')";
    if(!mysql_query($sql,$con))
     
    
    {
        die('Error : ' . mysql_error());
    }
}

获取大约 234 行中的 117 行,但其他行是空白的......任何想法

【问题讨论】:

  • 有什么问题?你可以​​放任何值
  • 您正试图引用一个像数组这样的对象。试试$data-&gt;something-&gt;otherthing$data = json_decode( $data , 1 )
  • 所以它在循环自动取款机中通过。一切都很好,但不是在解码中的第二个值是 3 我需要它在那个值 = 任何东西的地方
  • 快速查看底部的代码... $data 变量是从 json 解码中提取的

标签: php arrays json variables var


【解决方案1】:
$name = array_values($data['available_channels'])[0]['name'];

array_values 返回一个由源数组的值组成的新数组,从0 重新编号。

【讨论】:

    【解决方案2】:

    你可以统计数组中的通道数,然后循环遍历每个通道。

    for($i = 0; $i <= count($data['available_channels']); $i++) {
        $name = $data['available_channels'][$i]['name'];
        // TODO: Do something with the name
    }
    

    或者你可以按照@cske 所说的去做:

    $channels = [];
    foreach($data['available_channels'] as $k => $v) {
        // this will keep the key's the same
        $channels[$k] = $v['name'];
    }
    

    或者您可以选择更面向 OO 的方法,请参阅3v4l

    class Channel {
        private $_data;
        public function __construct($json) {
            $this->_data = json_decode($json, true);
        }
    
        public function parse() {
            $parsed = [];
            foreach($this->_data['available_channels'] as $k => $v) {
                $parsed[$k] = $v['name'];
            }
            $this->_data['available_channels'] = $parsed;
            return $this;
        }
    
        public function getByKey($key) {
            return $this->_data['available_channels'][$key];
        }
    }
    
    $c = new Channel($json_response);
    echo 'Name for Channel 3 is: ' . $c->parse()->getByKey('3');
    

    【讨论】:

    • foreach 不假设连续编号相同的结果foreach ($data['available_channels'] as $d) { $name = $d['name']; }
    • 是的,您甚至可以使用 while 循环。我更喜欢for() 所以我用它@cske
    • 不一样如果$data['available_channels]`键是'1,2,5`然后for会抛出一个错误
    • 不,它不会,因为索引从 0 开始,我们要关闭索引不是键 @cske
    • if($i &gt;= 3) { ... } - 使用你的常识@cske
    【解决方案3】:

    所以在更新 2 之后,这将起作用

    foreach($data['available_channels'] as $d) {
        $name           = $d['name'];
        $num            = $d['num'];
        $epg_channel_id = $d['epg_channel_id'];
        $category_name  = $d['category_name'];
        $stream_icon    = $d['stream_icon'];
    
        //insert into mysql table
        $sql = "INSERT INTO channels(name, num, epg_channel_id, category_name, stream_icon)
        VALUES('$name', '$num', '$epg_channel_id', '$category_name', '$stream_icon')";
        if (!mysql_query($sql, $con)) {
            die('Error : ' . mysql_error());
        }
    }
    

    或者如果使用 for 循环 @KDOT 答案,但由 @Niet 更正了 Dark Absol 代码

    $data['available_channels'] = array_values($data['available_channels']);
    for($i = 0; $i <= count($data['available_channels']); $i++) {
       $name           = $data['available_channels'][$i]['name'];
       ...
    }
    

    如果 php 数组的 count()=5 那么它的键是 0,1,2,3,4 这根本不是真的,这会导致 KDOT 的答案丢失行

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2019-05-16
      • 2016-01-04
      • 2019-01-07
      相关资源
      最近更新 更多