[英]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.