我有一个 php 函数。它检查当前时间在哪个字段中。然后检索该范围的成本。
字段结构:从(时间)- 到(时间)- 成本
+---------------------+---------+--------------------------+-------------------------+-----------------------+
| id_delivery_week | weekday |specific_time_cost_1 | specific_time_cost_2 | specific_time_cost_3 |
+---------------------+---------+-------------------------+-------------------------+--------------------------+
| 1 | Sunday | 00:00:00-10:00:00-130.00 | 10:00:00-18:00:00-120.00 | 18:00:00-24:59:00-150.0
下面是我检查当前时间成本的函数。
编辑
//user can pick day from drop down.picked day will receive in to `getData()`
protected function getData(){
if(isset($_GET['day']) && !empty($_GET['day'])){
$day=$_GET['day'];
$now = new DateTime();
$Date = $now->format('Y-m-d');
$time = $now->format('H:i:s');
$this->checkCostRanges($day,$time);
}
}
protected function checkCostRanges($day,$time){
$ranges=$this->getCostRanges($day); //mysql select query
foreach ($ranges as $range) {
if ((!empty($range['specific_time_cost_1']))){
$shipping_cost=$this->calRange($range['specific_time_cost_1'],$time);
}
if ((!empty($range['specific_time_cost_2']))){
$shipping_cost=$this->calRange($range['specific_time_cost_2'],$time);
}
if ((!empty($range['specific_time_cost_3']))){
$shipping_cost=$this->calRange($range['specific_time_cost_3'],$time);
}
}
}
$time :- 这是当前时间(例如:12:08:53)
$range:- 所有 3 个范围(specified_time_cost_1、specified_time_cost_2、specified_time_cost_3)
public function calRange($range,$time){
$cost_val="";
$parts = explode("-", $range);
$from = $parts[0];
$to = $parts[1];
$cost = $parts[2];
$curr_time = is_int($time) ? $date : strtotime($time); // convert non timestamps
$from_time = is_int($from) ? $from : strtotime($from);
$to_time = is_int($to) ? $to : strtotime($to);
if(($curr_time > $from_time) && ($curr_time <= $to_time)){//check current time is in which field
$cost_val=$cost; //get cost for the field
error_log("inside if ".$cost_val);
}
error_log("outside if ".$cost_val);
return $cost_val;
}
在 if
条件内,我可以获得当前时间的正确成本。根据示例时间,我可以获得 120.00
。因为 12:08:53
位于 special_time_cost_2
中。
但返回时在外面;
"",120.00,""(第一个空值,然后正确值,再次空值)
如何才能只返回正确的值?
最佳答案
您正在覆盖结果。例如,如果您与第一个时间范围匹配,您仍然会处理第二个时间范围,然后清除之前的结果。所以做这样的事情:
for ($i = 1; $i <= 3; $i++) {
if (!empty($range["specific_time_cost_$i"])){
$shipping_cost = $this->calRange($range["specific_time_cost_$i"],$time);
if ($shipping_cost !== "") break;
}
}
但请注意,您正在使用设计不当的数据库。您应该将范围存储在单独的表中,其中您将有一个对主表的外键引用、范围的序列号(例如 1、2 或 3)、开始时间、结束时间和成本,全部作为单独的字段。这将使处理变得更加容易(!),因为即使使用简单的 SQL 查询,您也可以找到匹配的时间范围。
关于php - 如何在条件之后返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47118988/