2016-01-16 54 views
0

一直試圖找出這個簡單的問題3天,不明白爲什麼該函數只刪除一些值,但留下其他人。(Needle,Haystack)with 2 arrays,confused

這是功能檢查壞域的列表與良域的列表,如果它發現一個壞域,它將它從好域列表中刪除。

這裏是我的代碼:

// check each bad domain, against each array in good array list 

$bad_domains = array('youtube.com', 'facebook.com', 'google.com', 'twitter'); 

$good_domains = array(
'http://www.wufoo.com/', 
'https://plus.google.com/u/0/b/105790754629987588694', 
'http://studioduplateau.com/ss=', 
'http://twitter.com/?lang=tic-toc', 
'http://twitter.com/?lang=KA-BOOM', 
'http://twitter.com/?lang=tic-toc', 
'http://twitter.com/?lang=KA-BOOM', 
'http://twitter.com/?lang=tic-toc', 
'http://twitter.com/?lang=KA-BOOM', 
'http://twitter.com/?lang=tic-toc', 
'http://twitter.com/?lang=KA-BOOM', 
'http://twitter.com/?lang=KA-BOOM', 
'lastofthemohicans.com' 
    ); 

function remove_excluded_domains($good_domains, $bad_domains) { 
    for($x=0; $x<count($bad_domains); $x++) 
    { 
     for($y=0; $y<count($good_domains); $y++) 
     { 
      if(strpos($good_domains[$y], $bad_domains[$x])) 
      { 
      unset($good_domains[$y]); 
      $good_domains = array_values($good_domains); 
      } 
     } 
    } 
    return $good_domains; 
} 

$spider_array = remove_excluded_domains($good_domains, $bad_domains); 

出於某種原因,它返回:

[0] => http://www.wufoo.com/ 
[1] => http://studioduplateau.com/ss= 
[2] => http://twitter.com/?lang=KA-BOOM 
[3] => http://twitter.com/?lang=KA-BOOM 
[4] => http://twitter.com/?lang=KA-BOOM 
[5] => http://twitter.com/?lang=KA-BOOM 
[6] => lastofthemohicans.com 

所以它刪除所有http://twitter.com/?lang=tic-toc,但保留所有http://twitter.com/?lang=KA-BOOM ..

爲什麼它這樣做?我嘗試玩array_values,但它仍然無法正常工作。

對不起,傻陣列值,只是希望它突出,所以它更清晰。感謝你的幫助。

回答

1

使用簡單的foreach循環,因爲那樣你不必使用array_values()函數。所以,你remove_excluded_domains()功能可按應該是這樣的:

function remove_excluded_domains($good_domains, $bad_domains) { 
    foreach($bad_domains as $bad_domain){ 
     foreach($good_domains as $key => $good_domain){ 
      if(strpos($good_domain, $bad_domain) !== false){ 
       unset($good_domains[$key]); 
      } 
     } 
    } 
    return $good_domains; 
} 

$spider_array = remove_excluded_domains($good_domains, $bad_domains); 

注:如果你想數組索引數字則返回數組上使用array_values()功能,像這樣:

$spider_array = array_values(remove_excluded_domains($good_domains, $bad_domains)); 
+0

哇,謝謝!根據Arman的評論,我也意識到,如果我在循環之外添加了一個域計數器,它不會減少計數($ good_domains)。但是你的解決方案更加優雅。謝謝! –

2

問題是,只要找到匹配項,您的代碼就會重新排列名爲$good_domains的數組,因此每次都會減少count($good_domains),但不會重置價值。

補充一點:

$y--; 

在此:

$good_domains = array_values($good_domains); 
+0

謝謝,你是對的,如果我只計算循環外部的域的數量,併爲($ y = 0; $ y <$ counter_domains; $ y ++)做的話也可以。我和Rajdeep的回答一樣,因爲它使代碼比我寫的代碼更優雅。感謝你的時間! –

+0

@Arman Ozak,我刪除了我的答案,但在你說錯了之前請檢查文檔! http://php.net/strpos。它返回一個int或一個false。不是真的。 – schellingerht