PHP 交替从数组中添加不同的值
PHP add different values out of array alternately
示例:
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);
}
}
您正在将 $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
。您还需要遍历用户数组:
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
因为只有一个 "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')
此外,用 动词 给您的方法(函数)命名是一个很好的约定,因为它们 "do" 是什么东西。在这种情况下,make_date_range
。由于我可以看到这是在 class 中(具有 public
关键字),因此将您的方法名称设为 camelCase
是一个好习惯,例如makeDateRange()
,同时让你的变量带有下划线。无论如何都不需要,但这是一个很好的做法。
希望这对您有所帮助。
万一有人遇到同样的问题:
我通过创建一个变量 $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++;
示例:
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);
}
}
您正在将 $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
。您还需要遍历用户数组:
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
因为只有一个 "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')
此外,用 动词 给您的方法(函数)命名是一个很好的约定,因为它们 "do" 是什么东西。在这种情况下,make_date_range
。由于我可以看到这是在 class 中(具有 public
关键字),因此将您的方法名称设为 camelCase
是一个好习惯,例如makeDateRange()
,同时让你的变量带有下划线。无论如何都不需要,但这是一个很好的做法。
希望这对您有所帮助。
万一有人遇到同样的问题:
我通过创建一个变量 $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++;