echo JSON_ENCODE($json) 仅包含最后一条记录的数据


echo JSON_ENCODE($json) only contains data for last record

我正在尝试使用json_encode将一些数据回显到我的ajax调用中,但我似乎只接收了一部分数据,特别是最后一条记录。 在下面的查询中,当我$q->num_rows();时,它正确地返回正确的行数 6。 但是,当我查看生成的 JSON 对象时,我发现它只有第 6 行的最后一对值。 第 1-5 行的数据无处可寻。

谁能看出我可能做错了什么? 谢谢。

function myAjaxFunction(){
    $muni = $this->input->POST('muni');
    $q = $this->db->query("SELECT SaleYear AS Y, NewSaleType AS T, count(*) AS C, format((sum(SalePrice) / sum(Quantity1)),0) AS R FROM tblsales WHERE  tblsales.SaleYear > 2007 AND tblsales.Quantity1 > 2000 AND (tblsales.NewSaleType = 'Industrial') AND tblsales.Municipality = '".$muni."' GROUP BY T,Y ORDER BY T,Y");
    $json_SaleYear = array();
    $json_AvrgRate = array();
    foreach ($q->result_array() as $row){
        $json_SaleYear = $row['Y'];
        $json_AvrgRate = $row['R'];
    }
    $json['Y'] = $json_SaleYear;
    $json['R'] = $json_AvrgRate;            
    echo json_encode($json);
    exit;
}

您已将$json_SaleYear$json_AvrgRate声明为数组,但没有使用数组索引来定义循环中的值foreach因此它只有一行记录,即最后一条记录。

仅更改部分代码

foreach ($q->result_array() as $row){
        $json_SaleYear[] = $row['Y'];
        $json_AvrgRate[] = $row['R'];
    }

您将数组替换为foreach循环中的值,而不是附加到数组中。因此,在循环的每次迭代中,$json_SaleYear/AvrgRate变量都会被当前行的信息覆盖。循环完成后,它们仅包含最后一行的信息。

而不是像这样更新变量,

foreach ($q->result_array() as $row){
    $json_SaleYear = $row['Y'];
    $json_AvrgRate = $row['R'];
}

你应该像这样附加到数组中,

foreach ($q->result_array() as $row){
    $json_SaleYear[] = $row['Y']; // Note the []'s.
    $json_AvrgRate[] = $row['R'];
}

替换以下内容

$json_SaleYear = array();
$json_AvrgRate = array();
foreach ($q->result_array() as $row){
    $json_SaleYear = $row['Y'];
    $json_AvrgRate = $row['R'];
}
$json['Y'] = $json_SaleYear;
$json['R'] = $json_AvrgRate;
echo json_encode($json);

跟:

$json = array( 
    'Y' => array(),
    'R' = array()
);
foreach ($q->result_array() as $row){
    $json['Y'][] = $row['Y'];
    $json['R'][] = $row['R'];
}
echo json_encode($json);

虽然您已将$json_SaleYear和$json_AvrgRate声明为数组,但您将其值设置为字符串。正确的格式如下

function myAjaxFunction(){
    $muni = $this->input->POST('muni');
    $q = $this->db->query("SELECT SaleYear AS Y, NewSaleType AS T, count(*) AS C, format((sum(SalePrice) / sum(Quantity1)),0) AS R FROM tblsales WHERE  tblsales.SaleYear > 2007 AND tblsales.Quantity1 > 2000 AND (tblsales.NewSaleType = 'Industrial') AND tblsales.Municipality = '".$muni."' GROUP BY T,Y ORDER BY T,Y");
    $json_SaleYear = array();
    $json_AvrgRate = array();
    $counter = 0;
    foreach ($q->result_array() as $row){
      $json_SaleYear[$counter] = $row['Y'];
      $json_AvrgRate[$counter] = $row['R'];
      $counter++;
    }
    $json['Y'] = $json_SaleYear;
    $json['R'] = $json_AvrgRate;            
    echo json_encode($json);
   exit;
}