Проверка того, находится ли дата между несколькими диапазонами дат в многомерном массиве в PHP

Я изо всех сил пытался решить ее, но не смог. Было бы здорово, если бы вы могли помочь мне в этом.

У меня есть эти два массива..

$firstarray — содержит дату [0] и стоимость товара [1] в этот день.

[0] => Array (
    [0] => 2020-12-01
    [1] => 24.00
    )
[1] => Array (
    [0] => 2020-12-05
    [1] => 16.00
    )
[2] => Array (
    [0] => 2020-12-07
    [1] => 12.00
    )
[3] => Array (
    [0] => 2020-12-15
    [1] => 0.00
    )
[4] => Array (
    [0] => 2020-12-16
    [1] => 0.00
    )
[5] => Array (
    [0] => 2020-12-16
    [1] => 100.00
    )

$secondarray — содержит несколько диапазонов дат [0] и [1], где стоимость [2] сильно отличается в пределах заданного периода.

[0] => Array (
    [0] => Array (
        [0] => 2020-12-01
        [1] => 2020-12-05
        [2] => 42.00
        )
    [1] => Array (
        [0] => 2020-12-06
        [1] => 2020-12-08
        [2] => 35.00
        )
    [2] => Array (
        [0] => 2020-12-09
        [1] => 2020-12-12
        [2] => 76.00
        )
    )
[1] => Array (
    [0] => Array (
        [0] => 2020-12-01
        [1] => 2020-12-05
        [2] => 42.00
        )
    [1] => Array (
        [0] => 2020-12-06
        [1] => 2020-12-08
        [2] => 35.00
        )
    [2] => Array (
        [0] => 2020-12-09
        [1] => 2020-12-12
        [2] => 76.00
        )
    )
[2] => Array (
    [0] => Array (
        [0] => 2020-12-04
        [1] => 2020-12-09
        [2] => 10.00
        )
    [1] => Array (
        [0] => 2020-12-10
        [1] => 2020-12-13
        [2] => 45.00
        )
    )
[3] => Array (
    [0] => Array (
        [0] => 2020-12-04
        [1] => 2020-12-09
        [2] => 10.00
        )
    [1] => Array (
        [0] => 2020-12-10
        [1] => 2020-12-13
        [2] => 45.00
        )
    )
[4] => Array (
    [0] => Array (
        [0] => 2020-12-04
        [1] => 2020-12-09
        [2] => 10.00
        )
    [1] => Array (
        [0] => 2020-12-10
        [1] => 2020-12-13
        [2] => 45.00
        )
    )
[5] => Array (
    [0] => Array (
        [0] => 2020-12-01
        [1] => 2020-12-05
        [2] => 42.00
        )
    [1] => Array (
        [0] => 2020-12-06
        [1] => 2020-12-08
        [2] => 35.00
        )
    [2] => Array (
        [0] => 2020-12-09
        [1] => 2020-12-12
        [2] => 76.00
        )
    )

Я хочу проверить, находится ли каждая дата в $firstarray между одним из диапазонов дат в $secondarray, если да — вывести значение по индексу [2] из $secondarray из этого диапазона дат, если нет — вывести значение в индекс [1] из массива $first.

Оба массива всегда будут иметь одно и то же число, которое в данном случае равно 5 (цикл foreach всегда должен выполняться только для одного и того же индекса), но количество массивов или диапазонов дат внутри могут быть разными.

большое спасибо!!

Что вы пробовали?

AbraCadaver 20.12.2020 22:33

Вы хотите сравнить каждую дату в $firstarray со всеми диапазонами в $secondarray или только диапазонами для соответствующего индекса?

Nick 20.12.2020 23:03

привет ник, не только для диапазонов дат в соответствующем индексе!

ntsu 20.12.2020 23:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
340
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это проверяет, находится ли дата первого массива между любым из диапазонов дат второго массива. Если вы хотите проверить другие индексы, просто увеличьте (или уменьшите) $index.

Чтобы вернуть правильную цену, просто раскомментируйте

return $firstarray[1]
and
return $secondarray[2]

Выход

Is between
Is not there
Is not there

Код

<?php
/*

================ Firstarray
[0] => Array (
        [0] => 2020-12-01
        [1] => 24.00
    )

================ Secondarray
[0] => Array (
    [0] => Array (
        [0] => 2020-12-01
        [1] => 2020-12-05
        [2] => 42.00
        )
    [1] => Array (
        [0] => 2020-12-06
        [1] => 2020-12-08
        [2] => 35.00
        )
    [2] => Array (
        [0] => 2020-12-09
        [1] => 2020-12-12
        [2] => 76.00
    )
*/

$firstarray = array(array('2020-12-01', '24.00'));
$secondarray = array(array(array('2020-12-01', '2020-12-05', '42.00'), array('2020-12-06', '2020-12-08', '35.00'), array('2020-12-09', '2020-12-12', '76.00')));

$index = 0;
echo check($firstarray[$index], $secondarray[$index]);

function check($firstarray, $secondarray)
{
    foreach ($secondarray as $key => $value) {
        if (
            // Check if date is between two dates
            (date('Y-m-d', strtotime($firstarray[0])) >= date('Y-m-d', strtotime($value[0]))) && 
            (date('Y-m-d', strtotime($firstarray[0])) <= date('Y-m-d', strtotime($value[1])))) 
        {
            echo "Is between".PHP_EOL;
            // return $secondarray[2];
        } else {
            echo "Is not there".PHP_EOL;
        }
    }
    
    // return $firstarray[1];
}
Ответ принят как подходящий

Вы можете использовать цикл foreach для значений в $firstarray, установив цену по умолчанию в качестве значения из этого массива. Затем вы можете использовать ключ из каждого значения для индексации в $secondarray и сравнить дату из $firstarray с каждым из диапазонов в $secondarray. Если дата находится в диапазоне, установите цену на значение из этого диапазона.

$prices = array();
foreach ($firstarray as $key => $value) {
    $price = $value[1];
    foreach ($secondarray[$key] as $range) {
        if ($value[0] >= $range[0] && $value[0] <= $range[1]) {
            $price = $range[2];
            break;
        }
    }
    $prices[] = $price;
}

print_r($prices);

Вывод (для ваших образцов данных):

Array
(
    [0] => 42
    [1] => 42
    [2] => 10
    [3] => 0
    [4] => 0
    [5] => 100
)

Демо на 3v4l.org

ух ты! Спасибо большое, Ник, я очень ценю это!

ntsu 20.12.2020 23:26

Другие вопросы по теме