Пример :
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
потому что этому методу отправляется только один «пользователь»:
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
ключевое слово), это хорошая привычка делать имена методов 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++;