Найти значение даты в массиве в переполнении стека

У меня есть даты, хранящиеся в массиве, но определения диапазонов дат в специальном формате, как это:

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 и специальный формат массива диапазонов дат.

2

Решение

Если вам нужно время в миксе, вы можете попробовать этот вариант

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

https://eval.in/1044922

1

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

Попробуй это

$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
2

Попробуй это:

$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 даты, которая была передана.

eval.in demo

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector