微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将Oracle列中的数据添加到PHP数组中?

如何解决如何将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”每天都在记录值。

用于处理CSV文件代码如下:

<?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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?