数据不存在时如何填充数组?

分享于2022年07月17日 arrays loops php while-loop 问答
【问题标题】:How to fill an array when the data does not exist?数据不存在时如何填充数组?
【发布时间】:2022-07-06 01:31:58
【问题描述】:

我有一个搜索合同上提供的“住宿”和“餐饮”服务的请求。此查询每年进行总和。一切正常!检索到的数据存储在一个数组中,然后发送到可以计算和显示动态图的 Javascript... 问题是有些年份没有“Restores”,所以While Loop无法将信息添加到不存在的Array中,所以图表不起作用,数据的colums移位!

   while ($data = $requete1->fetch()) {
        // Hébergement : 
        if($data['P_TYPE']=="HEBERGEMENT"){    
            $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
        }

        // Restauration : 
        if($data['P_TYPE']=="RESTAURATION"){    
            $restauration[] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
        }
    }

我需要这样的结果,当服务不存在时添加 0 值:

    // Hébergement années non comprises en bdd :  
    $hebergement[] = array("label"=> "2021", "y"=> 68279);
    $hebergement[] = array("label"=> "2020", "y"=> 30457);
    $hebergement[] = array("label"=> "2019", "y"=> 0);
    $hebergement[] = array("label"=> "2018", "y"=> 57993);
    $hebergement[] = array("label"=> "2017", "y"=> 49702);
    $hebergement[] = array("label"=> "2016", "y"=> 45493);
    $hebergement[] = array("label"=> "2015", "y"=> 38460);
        
    // Restauration années non comprises en bdd :  
    $restauration[] = array("label"=> "2021", "y"=> 12117);
    $restauration[] = array("label"=> "2020", "y"=> 697);
    $restauration[] = array("label"=> "2019", "y"=> 2687);
    $restauration[] = array("label"=> "2018", "y"=> 0);
    $restauration[] = array("label"=> "2017", "y"=> 40);
    $restauration[] = array("label"=> "2016", "y"=> 350);
    $restauration[] = array("label"=> "2015", "y"=> 200);*/

提前感谢您的帮助!

  • 在循环中,保留一个包含上一年值的变量(即最后处理的行中的年份)。然后检查当前年份的值...如果差距大于 1,请根据您的预期输出将一个虚拟条目插入到数组中,其中包含 0 值。
  • 你也可以用SQL来做:见 ***.com/questions/75752/…
  • 只需使用三元运算符,如 "y"=> $data['ca_total'] ?: 0
  • 非常感谢您提供这些指示...我完全理解您的意思,但我不知道如何实施!

【解决方案1】:

不是一个优雅的解决方案,但很简单,而且会奏效, 是在输出数组上创建另一个循环,并完成缺失的信息

首先,修改您的周期并获得最小和最大年份。 然后,在最小年和最大年之间补零。

$min = 9999; $max = 0;
while ($data = $requete1->fetch()) {
        // Hébergement : 
        if($data['P_TYPE']=="HEBERGEMENT"){    
                $hebergement[] =  array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
        }

        // Restauration : 
        if($data['P_TYPE']=="RESTAURATION"){    
                $restauration[] =   array("label"=> $data['ANNEE'], "y"=> $data['ca_total']);
        }

        /// Find the min and max year in datas
        if ($data['ANNEE'] < $min) $min = $data['ANNEE'];
        if ($data['ANNEE'] > $max) $max = $data['ANNEE'];
}

/// Cycle between min and max, and add zero padding value when data is missing
for ($i=$min; $i<=$max; $i++) {
        // Those are to search in a multidimensional associative array by key/value 
        if (!array_search($i, array_column($restauration, 'label'))) $restauration[] =   array("label"=> $i, "y"=> 0);
        if (!array_search($i, array_column($hebergement, 'label'))) $hebergement[] =   array("label"=> $i, "y"=> 0); 
}

我不得不说,这不是最优雅的解决方案,但它是有效的。如果明年将包含数据,它也将在未来工作,它在最小和最大年份之间是动态的。

----编辑 我在想这样更好地检索

$max = date("Y");

将在 2023 年和明年更新,直到新的“合同服务”在新的年份。

我也在想,根据设计,***的解决方案也可能是在绘制图形之前直接在 js 上进行,因为:

  1. 它减少了分配额外周期的服务器上的负载 客户,
  2. 它避免传递“零填充数据” 网络,
  3. 让它在 2023/01/01 3:00 在亚洲也能工作,显示 图中的“2023”..(使用 PHP 是不可能的)。

但是,如果数据如此之少,并且它不是每天一百万个请求的服务器,并且如果您不介意亚洲应该等待 GMT 零时间来获取新年的图表更新,那么 PHP 中的这个是不错。

【讨论】: