【问题标题】:JSON object as array in array how to keep while loop goingJSON对象作为数组中的数组如何保持while循环继续
【发布时间】:2019-03-20 13:18:38
【问题描述】:

我的问题是:

我将表连接在一起,有些表有多个我应该获取的数据,但我的 JSON 对象只检索一个。我认为这样做的原因是因为while循环也循环通过我的主表,获取所有内容并停止循环,考虑到没有任何东西可以循环(我根据我的数据库中的id获取我的数据,这些是@ 987654322@等)。

所以我的问题是:

我怎样才能遍历我的主表(一次),但继续遍历连接的表并将这些值插入到它们的“自己的”数组中?

这就是我现在拥有的:

$sqli = "SELECT event.*, typex.id, typex.type 
        FROM event 
            JOIN typex ON event.id = typex.id 
        WHERE event.id = ?";

mysqli_stmt_bind_param($stmt, 's', $editID); //fetch data based on ID
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$resultCheck = mysqli_num_rows($result);

if ($resultCheck > 0) {
    $data = array();

    while ($row = mysqli_fetch_assoc($result)) {
        $data['all'] = array($row); 
        $data['type'] = array($row['type']);  
    }
    //Echo data as JSON
    echo json_encode($data);

所以给你一个想法:

$data['all'] 是包含所有 $row 的数组(这样我就可以轻松地从我的主表中访问列)

$data['type'] 但是应该只保存表中的数据:typex(typex 是一个连接表)。

一个例子:

您有一个名为:stack 的主表和一个您加入的表:typex

考虑到主表在idunique 上有一个auto_increment,您想将表stack 中ID 为5 的所有行插入到数组$data['all'] 中,它将循环一次...但现在是我失败的部分,需要你的帮助: 在您的连接表中:typex 您有 2 行 ID 为 5。这 2 行应该被提取并插入到数组 $data['type'] 中。这是如何实现的?

【问题讨论】:

  • 我认为您需要从 typex 获取数据并加入事件,以便它通过所有 typex 结果。或者做两个单独的查询,一个用于事件,一个用于所有 typex 事件。
  • 你将如何通过 ajax 获取它?这意味着我必须进行多次 ajax 调用。
  • 不,您可以一次调用,只需将多个查询添加到上面的代码中即可。
  • 我认为您可能只需要在尝试绑定值并执行它之前准备该查询
  • @RiggsFolly 恕我直言,但我并没有那么迟钝,我考虑到向你们展示它是毫无用处的,所以我把它删掉了。因为它没有任何价值。我理解这种误解。\

标签: php mysql arrays json


【解决方案1】:
$data['all'] = array($row); 
$data['type'] = array($row['type']);  

这将始终设置最后一个 $row 的结果,如果您需要所有行,则需要这样做:

$data[] = array('all'=>$row,'type'=>$row['type']); 

现在 $data 的每一项都是一个有 2 个键的数组,alltype

【讨论】:

  • 但我还需要变量 $data = array();在while循环之外?或者我可以把那部分拿走吗?
  • 不要让它进入循环,如果你把它带进去,你将再次得到最后一行,因为它将被重新初始化。
  • 它有效!但是最后一个问题:如果你有例如:$data[] = array('all'=>$row,'type'=>$row['type'], 'problem'=>$row['problem']); 其中'type' 有 2 行要获取,problem 有 3 行要获取,你会怎么做?如何检查type 的长度(为2)和problem 的长度(为3?)
  • 每个键都有array作为值,因此您可以使用键获取值,然后可以像这样count($data[0]['type'])第一个索引上的类型数组计数\
  • 是的,正确,但我将如何检查数组的长度?例如:如果我想说for (var i = 0; i < $data[?]['type'].length)怎么办?
【解决方案2】:

这里有几件事要改变:

首先在查询中,eventtypex 表都有一个 id 列,因此您需要在其中一个列上使用别名,以便区分它们,所以我也在 typex.event 上这样做了以防万一。

$sqli = "SELECT event.*, typex.id as typex_id, typex.type as typex_type
        FROM event 
            JOIN typex ON event.id = typex.id 
        WHERE event.id = ?";

在这里我修改了代码以使用 OO mysqli,因为它更容易阅读

$stmt->bind_param('s', $editID); 
$stmt->execute();

$result = $stmt->get_result();
$resultCheck = mysqli_num_rows($result);

if ($resultCheck > 0) {
    $data = array();
    $last_event = 0;

    while ($row = $result->fetch_assoc()) {

        if ( $last_event != $row['id'] ) {
            $data['all'] = array($row); 
            $last_event = $row['id'];
        }

        $data['type'] = array('type' => $row['typex_type'], 'id' => $row['typex_id'] );
    }
    //Echo data as JSON
    echo json_encode($data);
}

【讨论】:

  • 这将从表typex中获取所有行,并从主表中获取所有行一次?如果是这样,我做了什么不同的事情?
  • 啊一分钟,我修改一下
  • 你去。试试看
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2012-10-14
  • 2014-03-11
  • 2020-10-13
  • 2015-11-25
  • 2016-02-03
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多