0

例子 :

00:00 22-03-2017, John Wilson
08:00 22-03-2017, Gemma Arterton
16:00 22-03-2017, Arnold Plank
00:00 22-03-2017, Timmy Brouwer
08:00 22-03-2017, John Wilson                  <- names repeating
16:00 22-03-2017, Gemma Arterton

我正在构建一个轮班系统,它会生成接下来 30 天的时间和日期。我正在尝试获取不同的相关名称以获取日期的回声,但到目前为止还没有运气。这些名称是交互式的,意味着可能只有 1 个和 25 个(可以这么说)。

这是我当前对函数代码的调用:

$month = $shift->date_range(date("Y-m-d"), date('Y-m-d', strtotime("+30 days")), "+" . $shift_facility['facility_shift_duration'] . " hours", "Y/m/d H:i:s", $user_per_facility);

这是我的功能本身:

public function date_range($first, $last, $step = '+1 day', $output_format = 'd/m/Y', $users)
{
    $dates   = array();
    $current = strtotime($first);
    $last    = strtotime($last);
    while ($current <= $last) {
        // Add date and time to array $dates
        $dates[] = date($output_format, $current) . ';' . $users[0]["user_id"];
        //check if we are still in range between the two dates
        $current = strtotime($step, $current);
    }
    return $dates;
}

$users包含所有用户数据,例如:

array(2) {
  [0]=>
  array(5) {
    ["user_id"]=>
    string(1) "3"
    ["user_alias"]=>
    string(7) "ND12345"
    ["user_facility"]=>
    string(2) "29"
    ["user_phone"]=>
    string(5) "12345"
    ["user_name"]=>
    string(9) "Jan steen"
  }
  [1]=>
  array(5) {
    ["user_id"]=>
    string(1) "7"
    ["user_alias"]=>
    string(7) "ND68596"
    ["user_facility"]=>
    string(2) "29"
    ["user_phone"]=>
    string(11) "31115648597"
    ["user_name"]=>
    string(8) "John Doe"
  }
}

$users[0]["user_id"]; 只输出名字,但我需要它们交替(看第一个例子)。

有没有人有任何想法可以为我指明正确的方向或帮助我一点?

提前谢谢^^

编辑:更多细节

我的函数调用在 foreach 中:

foreach ($facility->getfacilities() as $shift_facility) {

    $user_per_facility = $user->getusersbyFacilityId($shift_facility['facility_id']);

    if (isset($user_per_facility[0]["user_id"])) {
        //if shift count > dan db results generate new day
        $month = $shift->date_range(date("Y-m-d"), date('Y-m-d', strtotime("+30 days")),
            "+" . $shift_facility['facility_shift_duration'] . " hours", "Y/m/d H:i:s", $user_per_facility);

    }

}
4

2 回答 2

1

您将整个数组发送$users到该date_range()方法,您应该只将该数组的一个实体(例如单个用户)发送到该方法。

$users[0]从该方法中调用,该方法将始终引用该数组中的第一个(第零个)元素,而不是您要查找的特定元素。

问题从这个块开始:

if (isset($user_per_facility[0]["user_id"])) {
    //if shift count > dan db results generate new day
    $month = $shift->date_range(date("Y-m-d"), date('Y-m-d', strtotime("+30 days")),
        "+" . $shift_facility['facility_shift_duration'] . " hours", "Y/m/d H:i:s", $user_per_facility);

}

这只检查是否user_id在第一个数组元素中设置了。您还需要遍历 users 数组:

foreach ($facility->getfacilities() as $shift_facility) {
    $user_per_facility = $user->getusersbyFacilityId($shift_facility['facility_id']);

    // Make sure $users_per_facility can be iterated over
    if (count($users_per_facility) > 0 && is_array($users_per_facility))
        foreach ($users_per_facility as $u) {
            if (isset($u["user_id"])) {
                //if shift count > dan db results generate new day
                $month = $shift->date_range(date("Y-m-d"), date('Y-m-d', strtotime("+30 days")),
                    "+" . $shift_facility['facility_shift_duration'] . " hours", "Y/m/d H:i:s", $u);

            }       
        }
    }
}

然后修改您的date_range()方法以仅采用单个用户元素,而不是整个数组。为了澄清起见,我改为$users因为$user只有一个“用户”被发送到该方法:

public function date_range($first, $last, $step = '+1 day', $output_format = 'd/m/Y', $user) {
    $dates   = array();
    $current = strtotime($first);
    $last    = strtotime($last);
    while ($current <= $last) {
        // Add date and time to array $dates
        $dates[] = date($output_format, $current) . ';' . $user["user_id"];
        //check if we are still in range between the two dates
        $current = strtotime($step, $current);
    }
    return $dates;
}

我还建议您重新排序该date_range方法的参数列表。我建议$user先放:

public function date_range($user, $first, $last, $step = '+1 day', $output_format = 'd/m/Y')

此外,给方法(函数)名称加上动词是一个很好的约定,因为它们“做”一些事情。在这种情况下,make_date_range。因为我可以看到这是在一个类中(有关键字),所以在使用下划线保留变量的同时public制作方法名称是一个好习惯。无论如何都不需要,但这是一种很好的做法。camelCasemakeDateRange()

希望这可以帮助。

于 2017-03-22T10:19:11.390 回答
0

如果人们偶然发现同样的问题:

我通过创建一个变量来解决这个问题$i,如果它超过了 var 的大小,$users则将其设置回值 0。(以及为每个成功的行计数)

$i = 0;
 if ($i > count($users)-1) {
            $i = 0;
        }
        // Add date and time to array $dates
        $dates[] = date($output_format, $current) . ';' . $users[$i]["user_id"];

        //check if we are still in range between the two dates
        $current = strtotime($step, $current);
        $i++;
于 2017-03-22T11:50:47.647 回答