Nano Hash - криптовалюты, майнинг, программирование

Как найти значение в подмассиве и узнать ключевой индекс этого подмассива

У меня есть массив с такой структурой:

$months = array(
     MM => array(
         'start' => DD, 
         'end'   => DD,
         'type'  => (string),
         'amount'=> (float),
      ),
 );

ММ — месяц (01-12, строка), ДД — день месяца (01-31, строка). Не все месяцы могут быть в массиве. Для каждого месяца существует переменное количество подмассивов с диапазонами с уникальными днями в каждом. Например, у месяца есть три подмассива с тремя диапазонами дней, но дни, используемые в этих диапазонах, никогда не будут перекрываться или дублироваться, каждое значение DD уникально. За тем единственным исключением, что в некоторых диапазонах «начало» и «конец» могут совпадать (один и тот же день ДД), но никогда не будет двух одинаковых «начальных» дней или двух одинаковых «конечных» дней для каждого месяца.

Мне нужно использовать этот массив, зацикливая месяцы и дни в каждом месяце. Зацикливая каждый день месяца, мне нужно проверить, совпадает ли этот конкретный день в «начале» или «конце». Если совпадение верно, мне также нужно получить соседние значения.

При этом я столкнулся с одной проблемой: как мне узнать индекс ключа подмассива, где есть такое совпадение? Например, как я узнаю, идет ли матч

$months['09'][3]['start'] == $current_day_in_loop;

или скорее:

$months['09'][6]['start'] == $current_day_in_loop;

или еще один ключ?

Поскольку я не знаю, сколько диапазонов существует для каждого месяца, ключ индекса является переменным или может вообще не быть. Как узнать, находится ли совпадающее значение на ключе [3] или [6]? Как только я узнаю ключ, я могу использовать его для поиска соседних значений в одном и том же подмассиве.


  • Интересно, где вы хотите использовать эту структуру 16.07.2014
  • это своего рода календарь, и мне нужно хранить переменное количество диапазонов дней для каждого месяца - годы не учитываются; Я мог бы изменить структуру массива, если для этого есть веская причина. 16.07.2014
  • ну, вы можете легко добиться этого с помощью функций date() time() в php. Почему существует явная потребность в этом конкретном типе структуры? Я имею в виду, зачем заново изобретать велосипед, если он уже есть? 16.07.2014
  • Мне не нужны временные метки, и мне нужно брать годы из этих данных. Это не связано с настоящим временем. Есть ли какие-либо функции php, которые помогут мне построить диапазоны дат? Кроме того, позже мне нужно использовать те же данные массива в объекте javascript. 16.07.2014
  • date() преобразует любую строку даты или отметку времени в ваш собственный формат. если вы не хотите годы, это хорошо идти. Возможен диапазон дат постройки. Если вы получаете значения в php, то их легко передать в переменную JS. 16.07.2014
  • $months['09'][3]['start'] не соответствует структуре $months вверху 16.07.2014

Ответы:


1

Вы можете выполнить фильтр, чтобы определить, какие дни совпадают:

$matches = array_filter($months['09'], function($item) use ($current_day_in_loop) {
    return $item['start'] == $current_day_in_loop;
});
// if $matches is empty, there were no matches, etc.
foreach ($matches as $index => $item) {
    // $months['09'][$index] is the item as well
}
16.07.2014

2

Пожалуйста, попробуйте следующий пример для получения ключа:

//loop start
    if (($key = array_search($searchedVal, $dataArr)) !== false) {
        echo $key;
    }
// loop end
16.07.2014
  • Это сработало бы, если бы каждый элемент $dataArr был скаляром, но в данном случае он состоит из массивов. 16.07.2014

  • 3

    Если совпадение верно, мне также нужно получить соседние значения. При этом я столкнулся с одной проблемой: как мне узнать индекс ключа подмассива, где есть такое совпадение? Например, как я узнаю, идет ли матч

    Если я правильно понимаю, основная проблема, с которой вы столкнулись, заключается в том, что вы хотите получить следующий и предыдущий элементы совпадения, но не знаете, как это сделать, потому что не знаете, что такое ключи.

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

    $months = array(
         '01' => array(
             'start' => '1', 
             'end'   => '31',
             'type'  => 'hello',
             'amount'=> 2.3,
          ),
         '02' => array(
             'start' => '2', 
             'end'   => '31',
             'type'  => 'best',
             'amount'=> 2.5,
          ),
         '03' => array(
             'start' => '3', 
             'end'   => '31',
             'type'  => 'test',
             'amount'=> 2.4,
          ),       
     );
    
    $matches = array();
    $prev = null;
    $prev_key = null;
    $key = key($months);
    $month = reset($months);
    
    while($month) {
    
        $next = next($months);
        $next_key = key($months);
    
        foreach(range(1,31) as $current_day_in_loop) {
            //if end or start match grab the current, previous and next values
            if($month['start'] == $current_day_in_loop
            || $month['end'] == $current_day_in_loop) {
                $matches[$key] = $month;
    
                if($prev)
                    $matches[$prev_key] = $prev;
    
                if($next)
                    $matches[$next_key] = $next;
            }
        }
    
        $prev = $month;
        $prev_key = $key;
        $month = $next;
        $key = $next_key;
    }
    
    print_r($matches);
    
    16.07.2014
  • это правильно, но, к сожалению, в моем случае я нахожусь в цикле for, повторяющем каждый месяц года, независимо от того, есть ли $months или нет; когда мне нужно получить диапазоны, я уже зацикливаю дни в цикле sub for, и foreach из них я могу только проверить, есть ли совпадение. Но спасибо, полезно. 16.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование