2012-08-06 128 views
0

我面臨的問題是當我在另一個內部使用一個foreach,並且第一個foreach的數組有超過1個條目。我想要做的是從數組2中排除數組1的所有條目。我幾乎已經在所有相關的帖子上,無法自己解決它,如果可能,我需要一些幫助。對不起,我的英語不好。與數組嵌套的foreach -php

實施例:

$choice --->陣列與每個時間的隨機數量的條目(在本實施例2)

實施例:

/var/www/clients/client1/web1/web/images,/var/www/clients/client1/web1/web/tmp 

$list --->的隨機陣列每次的條目數(對於本示例爲10000)

示例:

/var/www/clients/client1/web1/web/images,/var/www/clients/client1/web1/web/tmp,/var/www/clients/client1/web1/web/includes,/var/www/clients/client1/web1/web/libraries,...... 

$list$choice

總是多條目,我有這樣的代碼在這裏:

foreach ($choice as $select) 
{ 
    foreach ($list as $file) 
    { 
     if ((strpos($file, $select)) !== false) 
     { 
      // exclude this 
     } 
     else 
     { 
      // include this 
     } 
    } 
} 

什麼上面的代碼會做(不幸)是:

步驟1.將比較$select入口1和全部$file入口。

第2步。將從所有$file條目中排除$select條目-1,並將包括$ select條目-2。

第3步。將$select條目-2與所有$file條目進行比較。

第4步。將從所有$file條目中排除$select條目2,並將包括$ select條目-1。

結果: 沒有排除。

任何幫助真正讚賞。我在這上了一個星期,我所嘗試過的所有東西都是把它們放在裏面,我沒有想法。 謝謝。

+1

您可以提供兩個數組的例子嗎? – Biotox 2012-08-06 22:20:18

+0

另一個考慮是數據來自何處。如果您是通過查詢獲得這些數據的,那麼利用數據庫的功能來實現這一點可能會更加簡潔。需要更多信息! – bpeterson76 2012-08-06 22:25:01

+0

我不確定你真的想要待辦事項,但是曾經使用'continue'內部循環?它將允許你繞過當前循環而不做任何更多的動作 – Hawili 2012-08-06 22:28:07

回答

1

我相信你試圖從$ choice中刪除$ list中的項目。 (或者是否是另一種方式?)您是否嘗試過array_diff函數?如果兩個數組中的項都相等,這將工作。例如:

<?php 

//Option 1: array_diff 
$bigger = array("A", "B", "C", "D", "E", "F"); 
$smaller = array("A", "B"); 

$result = array_diff($bigger, $smaller); 
print_r($result); 

如果您需要在刪除項目做額外的處理,你可以嘗試in_array,但是這需要平等的項目(如上面)。例如:

//Option 2: in_array (only one foreach loop) 
foreach ($smaller as $key => $item) { 
    if (in_array($item, $bigger)) { 
     //do something to "remove" it, for example: 
     unset($smaller[$key]); 
     unset($bigger[$key]); 
     //... 
    } 
} 
print_r($smaller); 
print_r($bigger); 

最後,如果在兩個數組中的項目都不能保證嚴格等於,你可以使用一個雙重的foreach。您需要在內部循環中標記項目並在外部循環中處理它們。例如:

//Option 3: double-foreach (items not strictly equals) 
$choice = array(
    "/var/www/clients/client1/web1/web/images", 
    "/var/www/clients/client1/web1/web/tmp" 
); 

$list = array(
    "/var/www/clients/client1/web1/web/images", 
    "/var/www/clients/client1/web1/web/tmp", 
    "/var/www/clients/client1/web1/web/includes", 
    "/var/www/clients/client1/web1/web/libraries", 
    // more items 
); 


foreach ($choice as $choice_key => $choice_item) { 
    $exists_in_list = FALSE; 
    foreach ($list as $list_key => $list_item) { 
     if (strpos($list_item, $choice_item) !== FALSE) { 
      //$choice_item is string-contained inside $list_item: 
      $exists_in_list = TRUE; 

      //Do some processing on $list (while "$list_key" is in scope). For example: 
      unset($list[$list_key]); //removes the matching items from $list 
      //... 

      break; 
     } 
    } 
    if ($exists_in_list) { 
     //Do post-processing on $choice. For example: 
     unset($choice[$choice_key]); //removes the matching items from $choice 
     //... 
    } 
} 

echo '$choice is now '; 
print_r($choice); 

echo '$list is now '; 
print_r($list); 

的$結果是:

//Option 1: 
Array //$result == $bigger - $smaller 
(
    [2] => C 
    [3] => D 
    [4] => E 
    [5] => F 
) 

//Option 2: 
Array //$smaller - $bigger 
(
) 
Array //$bigger - $smaller 
(
    [2] => C 
    [3] => D 
    [4] => E 
    [5] => F 
) 

//Option 3: 
$choice is now Array 
(
) 
$list is now Array 
(
    [2] => /var/www/clients/client1/web1/web/includes 
    [3] => /var/www/clients/client1/web1/web/libraries 
) 
+0

感謝您的回答,說實話,我以前從未使用in_array。我使用strpos是因爲我想比較webserver路徑/ url。如果你可以舉個例子嗎? – durduvakis 2012-08-06 22:26:31

+0

謝謝讓我試試這個! (是的,我希望無論是在$選擇出) – durduvakis 2012-08-06 22:47:24

+0

如果你只想從一個數組中刪除項目,你可以使用「array_diff」並完成它。否則,如果兩個數組中的項相等,則可以簡單地使用「in_array」,因爲它使用相等性。但是,如果項目不完全相同(但可能是相互之間的子串,則需要使用「strpos」。) – EthanB 2012-08-06 22:50:46