【问题标题】:Complex JSON array to MySQL via PHP通过 PHP 到 MySQL 的复杂 JSON 数组
【发布时间】:2013-11-19 04:12:07
【问题描述】:

我的目标是通过 PHP 将 JSON 结果中的信息选择放入 MySQL。我遇到的具体问题是从 JSON 结果中访问特定信息,因为它不是简单的列表格式。这是我正在谈论的那种结构的屏幕截图,其中突出显示了我感兴趣的信息。:

遗憾的是,我没有足够的声誉来发布图片,所以这里将其重新托管在 imgur 上:

在 ['streams'] 下将是 100 个流的列表。我想从每个结果中提取突出显示的信息并将其放入 MySQL 表中。

我对更简单的 JSON 文件和更简单的 json_decode 应用程序相当满意

    $result = json_decode($json);

    foreach ($result as $key => $value)

我在想也许我需要使用深度变量?但是很难找到关于它的大量信息。

如果有人可以给我任何帮助或向我指出一个好的信息来源(因为我一直在努力寻找任何东西),那将不胜感激。

如果有更多有用的信息,请告诉我,我会添加它。

编辑:json 请求链接:https://api.twitch.tv/kraken/streams?limit=2/

<?php
    //import data from twitch
    $json = json_decode(file_get_contents("https://api.twitch.tv/kraken/streams?limit=100/"), true);

    //create a DB connection
    $con = mysql_connect("CONNECTION INFO :D");
    mysql_connect_db('NOPE', $con);


    $result = json_decode($json);
    foreach ($result as $key => $value) {
        if ($value) {


            mmysql_query("INSERT INTO twitchinfo (viewers, status, display_name, game, delay, name) VALUES ($value->viewers, $value->status,$value->display_name,$value->game,$value->delay,$value->name)")or die(mysql_error());
        }
        // end connection
        mysql_close($con);
    }
    ?>

【问题讨论】:

  • 您能用 10 个字或更少的字数说明您要做什么吗?我已经读了三遍你的帖子,我知道你很困惑......但我对你想要做什么感到困惑。
  • 我会将我的整个代码添加到帖子中,也许这会有所帮助。但我正在寻找的主要内容是如何访问嵌入在 JSON 文件中的几层的信息。我想要来自 JSON -> Streams -> 0 的信息,然后在 0 -> Channel 内。然后以 0-100 重复。希望对您有所帮助,并立即添加我当前的代码。
  • I'm pretty much purely interested => I'm interested 和更多上下文,请。
  • 试图把事情弄清楚一点。

标签: php mysql json api


【解决方案1】:

在浏览器中打开这个网址 -

https://api.twitch.tv/kraken/streams?limit=100/

给我一​​个 JSON。我把它复制进去了-

http://www.jsoneditoronline.org/

并看到它有 streams_links 键。

根据您的问题,试试这个 -

$result = json_decode($json);
if( isset( $result['streams'] )){
    $streams = $result['streams'];
    foreach($streams as $stream) {
        $viewers = $stream->viewers;
        $status = $stream->channel->status;
        $display_name = $stream->channel->display_name;
        $game = $stream->channel->game;
        $delay = $stream->channel->delay;
        $name = $stream->channel->name;
        $sql = "INSERT INTO twitchinfo (viewers, status, display_name, game, delay, name) VALUES ($viewers, \"$status\", \"$display_name\", \"$game\", $delay, \"$name\")";
        mysql_query($sql)or die(mysql_error());         
    }
}

【讨论】:

  • 工作得很好,谢谢,我唯一需要改变的是 '$stream->channel->display_name' 到 '$stream'['channel']['display_name']'。可能是由于我的 netbeans 版本,但哦,再次感谢。
【解决方案2】:

也许你可以这样做:

$values = array();
$result = json_decode($json);

foreach($result['streams'] as $stream) {
    array_push(
        $values,
        array(
            'viewers'      => $stream['viewers'],
            'status'       => $stream['channel']['status'],
            'display_name' => $stream['channel']['display_name'],
            'game'         => $stream['channel']['game'],
            'delay'        => $stream['channel']['delay'],
            'name'         => $stream['channel']['name'],
        )
    );
}

或者:

foreach($result['streams'] as $stream) {
    $sqlQuery= "INSERT INTO TABLE(viewers, status, display_name, game, delay, name) VALUES ($stream['viewers'], $stream['channel']['status'], $stream['channel']['display_name'], $stream['channel']['game'], $stream['channel']['delay'], $stream['channel']['name']);"
    //dbHandler->executeQuery($sqlQuery);
}

【讨论】:

  • 现在将用它测试一些东西,问题是对于每个循环我想要一些来自 ['x'] 的东西(在这个例子中是 0)然后来自 ['channel'] 的东西,如果这有意义的话.我将我当前的代码添加到我的问题中可能会有所帮助。
  • 现在浏览所有内容并测试一些东西,虽然对我来说看起来不错!
【解决方案3】:

您的 JSON 对象基本上类似于...

[
    links: {
        self: http://example.com,
        next: http://example.com/foo,
    },
    streams: [
            {
                channel: {
                    foo: 'bar'
                },
                one: 'one',
                somethingElse: 'Something else',
                moreStuff: 'more stuff',
            }
    ]
]

当您解码 JSON 对象时,您会得到一个表示该对象的 PHP 对象/数组。

$x = json_decode('[1,2,3]') 

将为您提供与...相同的数组

$x= array(1,2,3)

如果您加载显示的 JSON 并运行以下代码:

foreach ($result as $key => $value)

这与访问$result-&gt;links$result-&gt;streams 相同。每个都包含更多数据。

如果我想在我的示例中从频道中获取“foo”元素,我会这样做:

$streams = $result->streams //Get the streams array
$stream = $streams[0]       //Get the first stream object
$channel = $stream->channel //Get the channel object
$foo = $channel->foo        //Get the value 'bar' out of the foo property.

只要结构是可预测的(而且确实如此),我就可以遍历流,因为它只是一个数组。

$streams = $result->streams //Get the streams array
foreach ($streams as $stream) {
    $channel = $stream->channel //Get the channel object
    $foo = $channel->foo        //Get the value 'bar' out of the foo property of every stream.
}

【讨论】:

  • 正是我正在寻找的信息,非常感谢,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2011-06-27
相关资源
最近更新 更多