PHP добавляет разные значения из массива попеременно

Пример :

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);

}

}

0

Решение

Вы отправляете целый массив $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(), сохраняя ваши переменные с подчеркиванием. Не требуется никакими средствами, но это хорошая практика.

Надеюсь это поможет.

1

Другие решения

В случае, если люди сталкиваются с тем же вопросом:

Я исправил эту проблему, создав переменную $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++;
0