簡體   English   中英

多維數組的PHP返回節

[英]PHP Return Section of a Multidimentional Array

我有一個帶有一系列事件ID的數組,其排列如下:$ event ['year'] ['month'] ['day'] = $ event_id(下面的完整結構)。

基本上,我想從給定日期(例如今天)輸出接下來的5個事件(或大約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"
                        )
                )
        )
)

有什么想法嗎? 抱歉,此說明有點復雜。 謝謝!

編輯:錯別字

此解決方案的一些優化:

$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.
                        }
                    }
                }
            }
        }
    }
}

如果數組是有序的,則可以使用二進制搜索來查找今天的日期或今天之前的最近日期(如果沒有今天的條目)。

然后,您將不得不遍歷數組,就好像它是平坦的一樣,並輸出接下來的三個條目。

這比遍歷整個數組要好,因為它不需要線性時間。

這不會很快,因為它會遍歷整個數組。 實際上,這可能是一種不好的方法。 不幸的是,這可能是最直接的方法。 每個事件的實際日期不會直接存儲,但我們可以得出。

$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.
        }
    }
}

值得注意的是,新陣列會選擇日期或之后的五個事件,但是由於每天(根據您的樣本數據)每天可能有多個事件,因此陣列中可能只有一些事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM