在While循环中建立索引的PHP数组

Dav*_*rne 0 php mysql arrays indexing

我正在尝试将自己的数据(当前仅显示在各种表和KPI指标块中)格式化为图形框架所需的格式。本质上,我希望我的一些值成为图形生成脚本的X和Y数据。

这是期望的结果(一个数组的示例,该数组可以从中生成图形/图形点):

$dataPoints = array(
        array("x"=> 1, "y"=> 41, label=> "18/07/19"),
        array("x"=> 2, "y"=> 35, label=> "19/07/19"),
        array("x"=> 3, "y"=> 50, label=> "20/07/19"),
        array("x"=> 4, "y"=> 45, label=> "21/07/19"),
        array("x"=> 5, "y"=> 52, label=> "22/07/19"),
        array("x"=> 6, "y"=> 68, label=> "23/07/19")
);
Run Code Online (Sandbox Code Playgroud)

我有以下代码可提取所需的相关信息:

//Build Graph Data Points
//
$daysmax=31;
$daycounter=0;
while($daysmax > $daycounter) {
  $sql_get_day_total_events="SELECT COUNT(*),date_sub(curdate(),INTERVAL $daycounter day) as date1 FROM tblticketlog
    WHERE DATE(date) = date_sub(curdate(),INTERVAL $daycounter day)
    AND ((action = 'New Support Ticket Opened')
    OR (action LIKE 'Status changed to Pending%')
    OR (action LIKE 'Status changed to In Progress%')
    OR (action LIKE 'New Ticket Response made by%'))";
  $get_day_total_events_result=mysqli_query($db,$sql_get_day_total_events);
  if(mysqli_num_rows($get_day_total_events_result) > 0) {
    while($row = $get_day_total_events_result->fetch_assoc()) {
      $day_result_date=strtotime($row['date1']);
      $day_result_value=$row['COUNT(*)'];
    }
  }
  $sql_get_day_escs="SELECT COUNT(*) FROM escalations
    WHERE DATE(esc_at) = date_sub(curdate(), INTERVAL $daycounter day)
    AND escalated = 1";
  $get_day_escs_result=mysqli_query($db2,$sql_get_day_escs);
  if(mysqli_num_rows($get_day_escs_result) > 0) {
    while($row = $get_day_escs_result->fetch_assoc()) {
      $day_escs_value=$row['COUNT(*)'];
    }
  }
  $day_slas_met = $day_result_value - $day_escs_value;
  $day_kpi_pcnt = round((($day_slas_met / $day_result_value) * 100),0);
  $daycounter=$daycounter + 1;
}
Run Code Online (Sandbox Code Playgroud)

总而言之,我从$ db中提取了30天(滚动)中每天的事件总数,从$ db2中提取了30天(滚动)中每天的“升级事件”数量。我也从$ db查询中获取日期。

对于我的图:
X = $ daycounter(只是数据点的增量数字ID,从0开始到30为止)
Y = KPI百分比,这是使用$ day_kpi_pcnt中的简单数学计算得出的
LABEL =纯文本格式的日期宾语

我尝试执行的操作
是在循环之前初始化$ datapoints数组:

$datapoints = array();
Run Code Online (Sandbox Code Playgroud)

然后,在循环底部的$ daycounter + 1行之前,我尝试将值推送到数组的索引中:

$datapoints[x] = $daycounter;
$datapoints[label] = date("d-m-Y",$day_result_date);
$datapoints[y] = $day_kpi_pcnt;
Run Code Online (Sandbox Code Playgroud)

但是,这最终只是一个空图。如果我var_dump数组,我似乎在否则为空的数组中得到结果的最后一行:

**Day: 30 -- 29-06-2019 - 6/6 - 100%**
array(3) { ["x"]=> int(30) ["label"]=> string(10) "29-06-2019" ["y"]=> float(100) } 
Run Code Online (Sandbox Code Playgroud)

老实说,PHP数组以及如何使用它们可能是我最薄弱的话题。我真的很努力地与他们抗争,并希望得到一些有关我犯错地方的指导甚至一些基本技巧。谢谢。

Pau*_*gel 5

您可能会执行以下操作:

$datapoints = [];
while (...) {
    ...
    $datapoints[x] = $daycounter;
    $datapoints[label] = date("d-m-Y",$day_result_date);
    $datapoints[y] = $day_kpi_pcnt;
    ...
}
Run Code Online (Sandbox Code Playgroud)

您将$datapoints在每次循环迭代中使用新的行值覆盖数组。因此,仅保留来自最后一行的值。相反,您需要将行添加到数组中:

$datapoints = [];
while (...) {
    ...
    $datapoints[] = [
        'x' => $daycounter,
        'label' => date("d-m-Y",$day_result_date),
        'y' => $day_kpi_pcnt,
    ];
    ...
}
Run Code Online (Sandbox Code Playgroud)