我在数组中有以下数据结构,我正在尝试计算总持续时间:
$elements = array(
'elementfrom-work' => "09:00",
'elementto-work' => "17:00",
'elementdays-work' => "5",
'elementfrom-karate' => "18:00",
'elementto-karate' => "20:00",
'elementdays-karate' => "3",
'elementfrom-stamp' => "21:00",
'elementto-stamp' => "22:00",
//it doest have the default days 'elementdays-stamp' set
//so it will take the default 7
'element-simple1' => "4", //it will take the default 7
'element-simple2' => "8", //it will take the default 7
'element-simple3' => "1",
'elementdays-simple3' => "1", //day is set
);
我已经设法做到但我的代码很乱,每个项目都获得子字符串并运行另一个for循环来检查是否存在任何其他元素(如天数)。
我试图计算每个项目的总持续时间,例如结果:
Work:40
Karate:6
Stamp:7
Simple1=28
Simple2=56
Simple3=1
total duration:138
这可以在没有两个for循环的情况下完成吗?如果不可能,你会如何计算它。
答案 0 :(得分:1)
看起来你知道天项的预期名称...检查它是否存在而不是循环,迭代数组键,当你到达“elementfrom-work”时,你可以检查数组是否有关键“elementdays-工作“而不是重复迭代以N级复杂度搜索此项目......
答案 1 :(得分:1)
我实际上发现这个问题非常有趣,所以你可以这样做:
$elements[] = array(
'elementfrom-work' => "09:00",
'elementto-work' => "17:00",
'elementdays-work' => "7",
'elementfrom-karate' => "18:00",
'elementto-karate' => "20:00",
'elementdays-karate' => "3",
'elementfrom-stamp' => "21:00",
'elementto-stamp' => "22:00",
'a' => "21:00",
'b' => "22:00"
);
并使用这两个功能:
function negative($x)
{
if($x < 0)
{
return -$x;
}
return $x;
}
function isTime($string)
{
$split = explode(":", $string);
if(isset($split[1]))
{
return true;
}
return false;
}
foreach($elements as $key => $val)
{
$total = 0;
$temp = 0;
$i = 0;
foreach($val as $innerKey => $time)
{
$isTime = isTime($time);
$split = explode(":", $time);
$h = $split[0];
switch($i)
{
case 0:
$temp -= $h;
break;
case 1:
$temp += $h;
break;
case 2:
if($isTime)
{
$mult = $temp *= 7;
$unsigned = negative($mult);
$total += $unsigned;
$temp = 0;
$temp -= $h;
$i = 0;
break;
}
$mult = $temp *= $h;
$unsigned = negative($mult);
$total += $unsigned;
$temp = 0;
$i = -1;
break;
default:
break;
}
$i++;
}
echo $total;
}
你对随身携带的想法有点时髦,但这样的事情应该有用。