У меня есть даты, хранящиеся в массиве, но определения диапазонов дат в специальном формате, как это:
Array
(
[0] => Array
(
[0] => Array ///date start
(
[0] => 2017
[1] => 10 //month
[2] => 3 //day
)
[1] => Array //date end
(
[0] => 2017
[1] => 10 //month
[2] => 5 //day
)
)
[1] => Array
(
[0] => Array //date start
(
[0] => 2017
[1] => 11
[2] => 23
)
[1] => Array //date end
(
[0] => 2017
[1] => 11
[2] => 25
)
)
)
И мне нужна функция, которая может возвращать, если в массиве существует конкретная дата строки
2017-10-01. is_in_array ('2017-10-01').
Но я не понимаю, как я могу сделать с foreach и специальный формат массива диапазонов дат.
Если вам нужно время в миксе, вы можете попробовать этот вариант
<?php
$discountDatesArr = [
[[2018, 8, 5, '00:00:00'], [2018, 8, 9, '23:59:59']],
[[2018, 8, 15, '00:00:00'], [2018, 8, 15, '23:59:59']],
[[2018, 8, 19, '00:00:00'], [2018, 8, 19, '23:59:59']],
[[2018, 8, 22, '00:00:00'], [2018, 8, 22, '23:59:59']],
[[2018, 8, 29, '00:00:00'], [2018, 8, 29, '23:59:59']],
];
$isDiscountSystemActive = false;
$dateUnix = strtotime(date("Y-n-j H:i:s"));
foreach ($discountDatesArr as $range) {
$rangeStartUnix = strtotime("{$range[0][0]}-{$range[0][1]}-{$range[0][2]} {$range[0][3]}");
$rangeEndUnix = strtotime("{$range[1][0]}-{$range[1][1]}-{$range[1][2]} {$range[1][3]}");
if ($dateUnix >= $rangeStartUnix && $dateUnix < $rangeEndUnix) {
$isDiscountSystemActive = true;
}
}
define ("ISDISCOUNTACTIVE", $isDiscountSystemActive);
echo ISDISCOUNTACTIVE;
Попробуй это
$arr = array(
[
[2017,10,3],
[2017,10,5]
],
[
[2017,11,23],
[2017,11,25]
],
[
[2017,12,1],
[2017,12,10]
]
);
function is_in_array($array, $date) {
$timestamp = strtotime($date);
$date = date('d',$timestamp);
$month = date('m',$timestamp);
$year = date('Y',$timestamp);
foreach ($array as $key => $value) {
foreach($value as $value2) {
if($value2[0]==$year && $value2[1] == $month && $date == $value2[2])
return true;
}
}
return false;
}
Здесь первый параметр для is_in_array()
это массив, из которого вы хотите найти дату
а второй параметр — это дата, которую вы ищете.
Следовательно
is_in_array('2017-12-1'); //will return true
is_in_array('2017-5-2'); //will return false
Попробуй это:
$rangesArr = [
[[2017, 10, 3], [2017, 10, 5]],
[[2017, 11, 23], [2017, 11, 25]],
];
function is_in_array ($date) {
global $rangesArr;
$dateUnix = strtotime($date);
foreach ($rangesArr as $range) {
$rangeStartUnix = strtotime("{$range[0][0]}-{$range[0][1]}-{$range[0][2]}");
$rangeEndUnix = strtotime("{$range[1][0]}-{$range[1][1]}-{$range[1][2]}");
if ($dateUnix >= $rangeStartUnix && $dateUnix < $rangeEndUnix) {
return true;
}
}
return false;
}
var_dump(is_in_array('2017-10-04')); // Returns true.
var_dump(is_in_array('2017-10-05')); // Returns false.
Выход:
bool(true)
bool(false)
По сути, все, что он делает — это циклически проходит по массиву, преобразует начальный и конечный массивы поддиапазона в метки времени Unix и сравнивает их с меткой времени Unix даты, которая была передана.