这可以在不使用两个for循环的情况下计算

时间:2013-03-07 23:49:28

标签: php algorithm sorting

我在数组中有以下数据结构,我正在尝试计算总持续时间:

 $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循环的情况下完成吗?如果不可能,你会如何计算它。

2 个答案:

答案 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;
}

你对随身携带的想法有点时髦,但这样的事情应该有用。