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

标签 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 循环来完成吗?如何实现?如果不可能,您将如何计算。

最佳答案

我实际上发现这个问题很有趣,所以你可以这样做:

$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;
}

你对进位的想法有点古怪,但类似的东西应该有用。

关于php - 这可以在不使用两个 for 循环的情况下计算吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15284165/

相关文章:

php - 消除 Excel 文档的缓存

javascript - Quickblox 对话框 - 用户无法恢复

php - 检索 Cakephp 2 分页中自定义限制的分页记录总数

algorithm - 这是NP完全的吗?

python - 有没有办法对管理模型中的列进行排序? Django

php - 如何在php中修剪数组值的空格

c++ - SPOJ : GENERAL (Time limit exceeded)

algorithm - 重新平衡任意 BST?

Pandas sort_values 给出了意想不到的结果

iphone - 如何对包含 NSDictionary 的 NSArray 进行排序?