如何解决如何将Oracle列中的数据添加到PHP数组中?
我有PHP代码正在从CSV文件读取数据以填充到HTML表中。正在读取的CSV文件如下所示(示例;不是整个文件):
A,2020-06-01,1,15,99.5,problem,B,100,A,2020-06-02,2020-06-03,30,99.2,2020-06-04,2020-06-05,10,99.7,2020-06-06,2020-06-07,2020-06-08,60,98.9,
服务“ A”和“ B”每天都在记录值。
<?PHP
$filename = "/var/tmp/dataset.csv";
if (($h = fopen($filename,"r")) !== FALSE)
{
$A_totals = array();
$B_totals = array();
$cols = array();
$A_index = 1;
$B_index = 1;
$cols = array("service_name","date","nbr_out","hrs_out","nbr_dGrd","hrs_dGrd","pct_avail","comments");
// Loop through rows in CSV file
while (($row = fgetcsv($h,10000,",")) !== FALSE) {
// Assign variables and create summary arrays for each service
$recordYear = strpos($row[1],$searchYear.'-');
$recordMonth = strpos($row[1],'-'.$searchMonth.'-');
if ($recordYear !== FALSE && $recordMonth !== FALSE) {
if ($row[0] == 'A') {
$A_totals['item_' . $A_index++] = array_combine($cols,$row);
}
if ($row[0] == 'B') {
$B_totals['item_' . $B_index++] = array_combine($cols,$row);
}
}
}
$A_nbr_out_totals = array_sum(array_column($A_totals,'nbr_out'));
$A_hrs_out_totals = array_sum(array_column($A_totals,'hrs_out'));
$A_nbr_dGrd_totals = array_sum(array_column($A_totals,'nbr_dGrd'));
$A_hrs_dGrd_totals = array_sum(array_column($A_totals,'hrs_dGrd'));
$A_pct_avail_totals = array_sum(array_column($A_totals,'pct_avail'));
$A_pct_avail_total_count = count(array_column($A_totals,'pct_avail'));
$A_pct_avail_avg = round(( $A_pct_avail_totals / $A_pct_avail_total_count ),4 );
$B_nbr_out_totals = array_sum(array_column($B_totals,'nbr_out'));
$B_hrs_out_totals = array_sum(array_column($B_totals,'hrs_out'));
$B_nbr_dGrd_totals = array_sum(array_column($B_totals,'nbr_dGrd'));
$B_hrs_dGrd_totals = array_sum(array_column($B_totals,'hrs_dGrd'));
$B_pct_avail_totals = array_sum(array_column($B_totals,'pct_avail'));
$B_pct_avail_total_count = count(array_column($B_totals,'pct_avail'));
$B_pct_avail_avg = round(( $B_pct_avail_totals / $B_pct_avail_total_count ),4 );
}
代码读取CSV文件,并提供给定月份/年份的CSV文件中每个数字“列”的按服务总计。然后将这些总数传递到HTML表以按服务显示。
我已经以“点赞”方式将CSV数据导出到Oracle表中。表中使用的列名与CSV文件中使用的列名相似,不同之处在于,在每个Oracle表列的开头都添加了“ IA_”前缀。
我的挑战:现在,我正在使用Oracle表来引用数据,然后在PHP代码中根据需要使用了OCI8。如果可能的话,我想保持PHP数组方法完整(据我所知)。 OCI8代码将读取Oracle表的每一行,并将其添加到数组中,以供其他数组命令(array_combine / array_sum / array_map)使用。
<?PHP
$A_totals = array();
$B_totals = array();
$cols = array();
$A_index = 1;
$B_index = 1;
$cols = array("service_name","comments");
$sql1 = "SELECT IA_SERVICE,TO_CHAR(IA_DATE,'MM/DD/YYYY HH12:MI:SS AM') AS IA_DATE,IA_NBR_OUT,IA_HRS_OUT,IA_NBR_DGrd,IA_HRS_DGrd,IA_PCT_AVAIL,IA_COMMENTS FROM i_avail WHERE TO_CHAR(IA_DATE,'Mon')='$searchMonth' AND TO_CHAR(IA_DATE,'YYYY')='$searchYear'";
$stid1 = oci_parse($connect,$sql1);
$r = oci_execute($stid1);
// Loop through rows in Oracle table
while (($row = oci_fetch_array($stid1,OCI_BOTH+OCI_RETURN_LOBS))!= false) {
// Assign variables and create summary arrays for each service
if ($row['IA_SERVICE'] == 'A') {
$A_totals['item_' . $A_index++] = array_combine($cols,$row);
}
if ($row['IA_SERVICE'] == 'B') {
$B_totals['item_' . $B_index++] = array_combine($cols,$row);
}
}
$A_nbr_out_totals = array_sum(array_column($A_totals,4 );
我从这次尝试中得到的结果反映了所定义的每个值的零,这是不期望的。
由于数据现在在Oracle中,因此我可以为每个使用COUNT和AVG函数的变量添加额外的sql语句...但是那将是很多语句。如果将来增加其他服务,sql语句的数量将相应增加。我想尽可能避免这种情况...因此,我希望我可以利用已经存在的代码。
这可能吗?如果没有,我是否可以尝试另一种不需要大量sql语句的方法?
解决方法
发现我的OCI8修订代码存在问题。在/ var / log / httpd / ssl_error_log中报告了错误“ PHP警告:array_combine():两个参数应该具有相同数量的元素”。在页面上添加了一些调试之后,我注意到虽然$ cols数组被定义为使用七个元素,但是Oracle返回的$ row有14个元素。我将$ cols数组调整为也使用14个元素,并且代码现在可以正常工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。