2016-11-20 19 views
1

我拉JSON數據爲mySQL導入,並在我的JSON文件的JSON解碼語句後設置變量我正在努力與某事。我的變量設置看起來像這樣

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

像這樣

"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 
    }, 

我的問題有關JSON是,對於服務的每個通道有一個新的數字開頭。所以我需要我的變量拉入像這樣,

$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但其他行都是空白...任何想法

+0

有什麼問題?你可以​​把任何值 –

+0

你試圖引用一個象arr的對象唉。試試'$ data-> something-> otherthing'或'$ data = json_decode($ data,1)' –

+0

,這樣它就可以在一個循環atm中通過。一切都很好,但不是解碼的第二個值是3的地方,我需要它的值=任何 –

回答

0

可以計數陣列內的信道數,然後通過每個信道循環。

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'); 
+0

中提取出來,而不是假定連續的編號相同的結果foreach($ data ['available_channels']爲$ d){name = $ d ['name']; }' – cske

+0

是的,你甚至可以使用while循環。我更喜歡'for()',所以我用@cske – KDOT

+0

不一樣如果$ data ['available_channels']'鍵是'1,2,5'那麼'for'會拋出一個錯誤 – cske

1
$name = array_values($data['available_channels'])[0]['name']; 

array_values返回由源陣列的值組成的新數組,重新編號爲0

0

所以更新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()); 
    } 
} 

或者,如果與循環@KDOT答案,但@Niet糾正黑暗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什麼couches缺少行與KDOT的答案

相關問題