【问题标题】:how to make array of array by looping result from a query如何通过循环查询结果来制作数组数组
【发布时间】:2017-08-18 19:39:41
【问题描述】:

我有一个关于游戏的调查,我有一个用于游戏数据的表格,另一个用于人们的答案。

我想以 Json 格式输出一个数组,以在数组中包含 3 个最喜欢的游戏名称及其年份中的每一个的答案。

预期输出

[
    {
    "id": "1",
    "username": "userX",
    "g1": {"name": "game1", "year": "1991"},
    "g2": {"name": "game2", "year": "1992"},
    "g3": {"name": "game3", "year": "1993"},
    }
]

我尝试过的

$sql = "SELECT * FROM tbAnswers AS answer INNER JOIN tbgames AS game ON answer.g1 = game.id";

try {
    $db = new db();
    $db = $db->connect();
    $stmt = $db->prepare($sql);

    $stmt->execute();

    $answer = $stmt->fetchAll(PDO::FETCH_OBJ);

    $db = null;

    if(empty($answer)) {
        $response->getBody()->write
        ('
        {
            "error":
            {
                "status":"400",
                "message":"Invalid Request"
            }
        }');
    } else {
        $response->getBody()->write(json_encode($answer));
    }
} catch(PDOException $e) {
    $response->getBody()->write
    ('
    {
        "error":
        {
            "message":'. $e->getMessage() .'
        }
    }');
}

当前输出

[
    {
    "id": "1",
    "username": "userX",
    "name": "game1",
    "year": "1991"
    }
]

我认为我应该在其他地方做一个 foreach 来完成每场比赛并根据答案中的 id 回显结果,但我不知道如何应用它

  1. foreach 的放置位置
  2. 如何根据每个游戏id选择并获取结果
  3. json格式怎么做

我确定这不是我的做法,这就是我试图在 else 中回显数据的方式

echo"[";
echo"\n{";
echo"\n";
echo '"id:"'.' "'.$answer[0]->id.'",';
echo"\n";
echo"}\n";
echo"]";

这是我的表格结构

tbGames

    id   ,  name    ,  year
     1   , 'game1'  , '1991'
     2   , 'game2'  , '1992'
     3   , 'game3'  , '1993'
     4   , 'game4'  , '1994'

tbAnswers

   id   ,    name    ,    g1    ,   g2    ,   g3
    1   ,    userX   ,    1     ,   2     ,    3  
    2   ,    userY   ,    3     ,   1     ,    4
    3   ,    userZ   ,    1     ,   1     ,    2
    4   ,    userW   ,    2     ,   3     ,    4

【问题讨论】:

  • 首先,您的 sql 查询应该是这样的:SELECT * FROM tbAnswers AS answer INNER JOIN tbgames AS game1 ON answer.g1 = game1.id INNER JOIN tbgames AS game2 ON answer.g2 = game2。 id INNER JOIN tbgames AS game3 ON answer.g3 = game3.id
  • 你需要改变你的查询而不是answer.g1 使用answer.id 这一定是得到你需要的数据
  • @perodriguezl 你能告诉我在哪里放置foreach如何根据每个游戏ID选择和获取结果如何以json格式进行
  • 用这个 $sql = "SELECT answer.id a_id, answer.name a_name, game1.id g1_id, game1.name g1_name, game1.year g1_year, game2.id g2_id, game2 替换你的 SQL 查询.name g2_name, game2.year g2_year, game3.id g3_id, game3.name g3_name, game3.year g3_year FROM tbAnswers AS answer INNER JOIN tbgames AS game1 ON answer.g1 = game1.id INNER JOIN tbgames AS game2 ON answer.g2 = game2.id INNER JOIN tbgames AS game3 ON answer.g3 = game3.id";并显示新的(完整)输出
  • @perodriguezl 我之前确实尝试过,它显示的输出与我在问题中发布的当前输出相同,即使我添加了所有内部连接

标签: php mysql arrays json


【解决方案1】:

使用这个查询:

$sql = "SELECT answer.id a_id, answer.name a_name, game1.id g1_id, game1.name g1_name, game1.year g1_year, game2.id g2_id, game2.name g2_name, game2.year g2_year, game3.id g3_id, game3.name g3_name, game3.year g3_year FROM tbAnswers AS answer INNER JOIN tbgames AS game1 ON answer.g1 = game1.id INNER JOIN tbgames AS game2 ON answer.g2 = game2.id INNER JOIN tbgames AS game3 ON answer.g3 = game3.id";

您应该将 else 语句的内容更改为:

} else {
    foreach($answer as $value) {
        $array_resp[]=[
            'id' => $value->a_id,
            'username' => $value->a_name,
            'g1' => ['name'=>$value->g1_name, 'year'=>$value->g1_year],
            'g2' => ['name'=>$value->g2_name, 'year'=>$value->g2_year],
            'g3' => ['name'=>$value->g3_name, 'year'=>$value->g3_year],
            ];
    }
    $response->getBody()->write(json_encode($array_resp));
}

【讨论】:

  • 您的回答很有道理,但我收到此错误无法使用 stdClass 类型的对象作为数组
  • 是的,你是对的,你应该尝试我应用的修改,@mirvatJ
  • 现在我无法使用 Slim\Http\Response 类型的对象作为数组
  • @mirvatJ 将 $response 变量名称更改为 $array_resp
  • 我现在想出了一个:p 你很棒的@perodriguezl 非常感谢你的帮助!!
猜你喜欢
  • 2016-11-18
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多