Диапазон дат PHP, массив

У меня есть диапазон дат, выбранный из базы данных. В этом конкретном примере дата находится между 20 июня – 29 июня.

Мне удалось создать массив этих дат, однако дата повторяется много раз.

Мой массив выглядит так:

Array ( [0] => 2013-06-20 [1] => 2013-06-20 [2] => 2013-06-20 [3] => 2013-06-20 [4] => 2013-06-20 [5] => 2013-06-20 [6] => 2013-06-20 [7] => 2013-06-20 [8] => 2013-06-20 [9] => 2013-06-21 [10] => 2013-06-21 [11] => 2013-06-21 [12] => 2013-06-21 [13] => 2013-06-21 [14] => 2013-06-21 [15] => 2013-06-21 [16] => 2013-06-21 [17] => 2013-06-21 [18] => 2013-06-22 [19] => 2013-06-22 [20] => 2013-06-22 [21] => 2013-06-22 [22] => 2013-06-22 [23] => 2013-06-22 [24] => 2013-06-22 [25] => 2013-06-22 [26] => 2013-06-22 [27] => 2013-06-23 [28] => 2013-06-23 [29] => 2013-06-23 [30] => 2013-06-23 [31] => 2013-06-23 [32] => 2013-06-23 [33] => 2013-06-23 [34] => 2013-06-23 [35] => 2013-06-23 [36] => 2013-06-24 [37] => 2013-06-24 [38] => 2013-06-24 [39] => 2013-06-24 [40] => 2013-06-24 [41] => 2013-06-24 [42] => 2013-06-24 [43] => 2013-06-24 [44] => 2013-06-24 [45] => 2013-06-25 [46] => 2013-06-25 [47] => 2013-06-25 [48] => 2013-06-25 [49] => 2013-06-25 [50] => 2013-06-25 [51] => 2013-06-25 [52] => 2013-06-25 [53] => 2013-06-25 [54] => 2013-06-26 [55] => 2013-06-26 [56] => 2013-06-26 [57] => 2013-06-26 [58] => 2013-06-26 [59] => 2013-06-26 [60] => 2013-06-26 [61] => 2013-06-26 [62] => 2013-06-26 [63] => 2013-06-27 [64] => 2013-06-27 [65] => 2013-06-27 [66] => 2013-06-27 [67] => 2013-06-27 [68] => 2013-06-27 [69] => 2013-06-27 [70] => 2013-06-27 [71] => 2013-06-27 [72] => 2013-06-28 [73] => 2013-06-28 [74] => 2013-06-28 [75] => 2013-06-28 [76] => 2013-06-28 [77] => 2013-06-28 [78] => 2013-06-28 [79] => 2013-06-28 [80] => 2013-06-28 [81] => 2013-06-29 [82] => 2013-06-29 [83] => 2013-06-29 [84] => 2013-06-29 [85] => 2013-06-29 [86] => 2013-06-29 [87] => 2013-06-29 [88] => 2013-06-29 [89] => 2013-06-29 ) 

Как видно из массива, существует 89 экземпляров. Но это всего лишь 9 дней?

У меня такое чувство, что это связано с моей петлей.

Мой PHP-код выглядит следующим образом:

 $user_availabilty = $this->vendor_model->get_user_availability($this->get_user_id()); if($user_availabilty) { foreach($user_availabilty as $user_avail) { $start = strtotime($user_avail->user_availablity_startdate); $end = strtotime($user_avail->user_availablity_enddate); $times = array(); for ($i = $start; $i <= $end; $i += 24 * 3600) { for ($j = 9; $j <= 17; $j++) { $times []= date("Ymd", $i); } } } 

Как получить только 9 экземпляров в моем массиве, а не 89?

Какова цель следующей строки?

 for ($j = 9; $j <= 17; $j++) 

Я думаю, вам нужно просто отметить эту строку, чтобы получить то, что вы хотите.

 // for ($j = 9; $j <= 17; $j++) 

Попробуйте с помощью array_unique

 $times = array_unique($times); 

Используйте функцию array_unique .

Пример прямо из руководства PHP.

 <?php $input = array("a" => "green", "red", "b" => "green", "blue", "red"); $result = array_unique($input); print_r($result); ?> 

Выход будет

 Array ( [a] => green [0] => red [1] => blue ) 

Это потому, что ваш массив генерирует несколько экземпляров даты «дня» для каждого пользователя (у вас есть 9 пользователей!) Вам действительно не нужно вытаскивать свой список пользователей для создания диапазона дат

Вы можете просто использовать код ниже без привлечения пользователя, чтобы сгенерировать свой диапазон дат, а затем сделать свой userpull отдельно, передавая этот массив для сравнения / проверки.

 $start = strtotime($user_avail->user_availablity_startdate); $end = strtotime($user_avail->user_availablity_enddate); $times = array(); for ($i = $start; $i <= $end; $i += 24 * 3600) { for ($j = 9; $j <= 17; $j++) { $times []= date("Ymd", $i); } } 

Как было предложено в других ответах, вы можете использовать array_unique (), чтобы исправить это, но tbh я бы посмотрел на весь ваш логический поток, нет необходимости в циклах в циклах для генерации даты начала и окончания. Даже меньше soo, если вы тянете мин / макс от доступных пользователей в базе данных mysql (найдите MIN () MAX () и DISTINCT)

Использовать это

 $user_availabilty = $this->vendor_model->get_user_availability($this->get_user_id()); if($user_availabilty) { foreach($user_availabilty as $user_avail) { $start = strtotime($user_avail->user_availablity_startdate); $end = strtotime($user_avail->user_availablity_enddate); $times = array(); for ($i = $start; $i <= $end; $i += 24 * 3600) { for ($j = 9; $j <= 17; $j++) { if (!in_array(date("Ymd", $i),$times)){ $times []= date("Ymd", $i); } } } } 

Этим вы проверяете, что данные уже существуют в этом массиве, и если он не существует, он будет добавлен в массив