PHP Возвращает секцию многомерного массива - PullRequest
0 голосов
/ 25 июля 2010

У меня есть массив с серией идентификаторов событий, организованных следующим образом: $ event ['year'] ['month'] ['day'] = $ event_id (полная структура ниже).

В основномЯ хочу вывести следующие 5 событий (или около того) с определенной даты (например, за сегодняшний день).

Я прошел руководство по PHP, но не нашел подходящего решения.Я полагаю, что я мог бы просто пройтись по каждому шагу, но там могут быть сотни событий.Если бы я знал смещение, я мог бы использовать array_slice, но я не уверен, как получить смещение, не просматривая весь массив.Если бы я мог установить указатель, то я бы просто перебрал.Но я понимаю, что нет способа установить указатель в массиве PHP.

Определенный запрос MySQL также не очень выполним, так как данные плохо организованы (это использование мета-ключей вБаза данных Wordpress).Возможно, мне придется использовать несколько JOIN, поэтому я думаю, что производительность будет плохой.

Учитывая текущий год, месяц и день (например, $ event [$ year] [$ month][$ day], я хочу просто показать следующие 5 событий.

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

Array
(
    [2010] => Array
        (
            [1] => Array
                (
                    [1] => Array
                        (
                            [594] => "Event"
                        )
                )
            [2] => Array
                (
                    [1] => Array
                        (
                            [592] => "Event",
                            [524] => "Event"
                        )

                    [2] => Array
                        (
                            [580] => "Event"
                        )
    [2011] => Array
        (
            [1] => Array
                (
                    [1] => Array
                        (
                            [587] => "Event"
                        )
                )
        )
)

Мысли? Извините, если это описание немного сложное. Спасибо!

Редактировать: опечатки

Ответы [ 3 ]

0 голосов
/ 25 июля 2010

Это не будет быстрым, потому что оно перебирает весь массив.На самом деле, это, вероятно, плохой способ сделать это.К сожалению, это может быть самым простым способом.Фактическая дата каждого события не сохраняется напрямую, но мы можем получить ее.

$earliest_date = strtotime('next Monday'); // or whatever.
$new_events = array();
foreach($array as $year => $a) {
    foreach($array[$year] as $month => $b {
        foreach($array[$year][$month] as $day => $events) {
            $date = strtotime("$year-$month-$day");
            if($date >= $earliest_date)
                $new_events[] = array( 'date' => $date, 'events' => $events );
            if(count($new_events) >= 5)
                break 3; // Breaks out of all three loops.
        }
    }
}

Следует отметить, что новый массив выбирает пять событий в или после даты, но поскольку может быть несколько событийв день (по данным вашего примера), возможно, что только некоторые из событий могут быть в массиве.

0 голосов
/ 11 марта 2014

Некоторая оптимизация для этого решения:

$earliest_date  = strtotime('next Monday'); // or whatever.

$earliest_year  = date('Y', $earliest_date); 

$earliest_month = (int)date('m', $earliest_date); //(int) for leading zero remove

$earliest_day   = date('j', $earliest_date); $new_events = array();

foreach($array as $year => $a) {
    if ($year>=$earliest_year) {
        foreach($array[$year] as $month => $b {
            if ($month>=$earliest_month) {
                foreach($array[$year][$month] as $day => $events) {
                    $date = strtotime("$year-$month-$day");
                    if($date >= $earliest_date) {
                        $new_events[] = array( 'date' => $date, 'events' => $events );
                        if(count($new_events) >= 5) {
                            break 3; // Breaks out of all three loops.
                        }
                    }
                }
            }
        }
    }
}
0 голосов
/ 25 июля 2010

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

Тогда,вам придется перебирать массив, как если бы он был плоским, и выводить следующие три записи.

Это лучше, чем перебирать весь массив, поскольку он не требует линейного времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...