2013-12-22 46 views
1

我有一個我想要傳遞給函數的urls數組,我將使用cron作業每10分鐘只傳遞其中的2個,我將該數組的最後一個通過的索引存儲在數據庫中,問題是我不知道如何通過前2個元素時,最後一個傳遞的元素是數組中的最後一個,讓我的代碼解釋:如何遍歷一個數組,當我們到達結尾時重新開始?

$sites = array(
    'http://www.example.com/', 
    'http://www.example1.com/', 
    'http://www.example2.com/', 
    'http://www.example3.com/', 
    'http://www.example4.com/', 
    'http://www.example5.com/' 
); 

// the number of urls to pass to the function 
// Edit: I forgot to say that this number might change later 
$sites_to_pass = 2; 

// this value is supposed to be stored when we finish processing the urls 
$last_passed_index = 2; 

// this is the next element's index to slice from 
$start_from = $last_passed_index + 1; 

// I also want to preserve the keys to keep track of the last passed index 
$to_pass = array_slice($sites, $start_from, $sites_to_pass, true); 

array_slice()工作正常,但是當$last_passed_index4我只得到數組中的最後一個元素,當它是5(最後一個索引)時,我得到一個空數組。

我想要做的是當它的4獲得最後一個元素和第一個元素,當它是5這是最後一個元素的索引來獲得數組中的前兩個元素。

我不太擅長與PHP,任何建議我應該做什麼,而不是創建一個函數來檢查索引?

+0

你問來運行它每隔十分鐘,而且當它完成重新開始。你想要它做什麼? – 2013-12-22 16:55:30

+0

@Allendar腳本應定期檢查這些網址。 – Pierre

+0

我認爲已經給出的答案可以幫助你彼得。我只想補充一點,如果你打算由於某種原因不停地運行這個腳本,你應該小心。如果PHP進程(腳本)從不停止,它將繼續消耗服務器中越來越多的內存。 PHP不能真正記憶得很好。如果在另一個cron作業仍在運行而另一個啓動時沒有問題,將crontab設置爲每1分鐘運行一次就沒有問題。 – 2013-12-22 16:59:23

回答

1

一個有趣的解決方案是利用SPL IteratorsInfiniteIterator是一個使用。

在這個例子中,你開始與最後一個數組元素並重復兩次:

$sites = array(
    'http://www.example0.com/', 
    'http://www.example1.com/', 
    'http://www.example2.com/', 
    'http://www.example3.com/', 
    'http://www.example4.com/', 
    'http://www.example5.com/' 
); 

$result = array(); 
$infinite = new InfiniteIterator(new ArrayIterator($sites)); 

// this value is supposed to be stored when we finish processing the urls 
$last_passed_index = 5; 

// this is the next element's index to slice from 
$start_from = $last_passed_index + 1; 

foreach (new LimitIterator($infinite, $start_from, 2) as $site) { 
    $result[] = $site; 
} 

var_dump($result); 

// output 
array(2) { 
    [0]=> 
    string(24) "http://www.example0.com/" 
    [1]=> 
    string(24) "http://www.example1.com/" 
} 
+0

謝謝,這是一個非常好的解決方案,但是我們可以像'array_slice()'的結果一樣保留原始密鑰,以便我們下次可以傳遞它。 – Pierre

+0

沒關係,我找到解決方案來獲取密鑰,在foreach循環中我們使用'as $ key => $ site'並將其存儲爲'$ result [$ key] = $ site'。 – Pierre

0

有點髒,但類似:

$to_pass = $start_from == 5 ? array($sites[5], $sites[0]) : array_slice($sites, $start_from, $sites_to_pass, true); 
1

半巧招:複製與array_merge的URL列表,所以你有它重複兩次。然後從該加倍列表中選擇。這可以讓你從結尾處選擇重疊開始的切片。

$start_from = ($last_passed_index + 1) % count($sites_to_pass); 
$to_pass = array_slice(array_merge($sites, $sites), $start_from, $sites_to_pass, true); 

添加% count($sites_to_pass)品牌一旦它超過了陣列的端部開始$start_from背面上爲0。這可以讓你永遠循環。

相關問題