我有一个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个范围(specific_time_cost_1,specific_time_cost_2,specific_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
位于specific_time_cost_2
。
但是如果返回就在外面;
&#34; &#34;,120.00,&#34; &#34; (第一个空值,然后是正确值,再次为空值)
我怎样才能返回正确的值?
答案 0 :(得分:0)
您正在覆盖结果。例如,如果您与第一个时间范围匹配,则仍处理第二个时间范围,然后清除以前的结果。所以做这样的事情:
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查询。