2014-11-08 98 views
0

我有兩個來自不同來源(MySQL,Excel)的電子郵件列表,類似兩個我的 示例。我在php中創建了兩個數組,比較它們。 「$ mail_old」數組是包含幾百個地址的主列表,在「$ mail_new」 中有更改。名稱相同,但一些域名已更改。PHP比較數組並替換值

首先,我想檢查哪個新地址不會出現在舊列表中,哪個 工作得很好。但我找不到替代它們的方法,array_replace()似乎沒有幫助這裏。 array_diff()也努力檢查差異,但我沒有得到任何進一步的。

這是我到目前爲止,如果有人可以給我一個提示如何 舊地址取代新的。

非常感謝!

<?php 
 
    $mail_old = array('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]',); 
 
    $mail_new = array('[email protected]', '[email protected]', '[email protected]', '[email protected]'); 
 

 
    foreach ($mail_new as $changed) { 
 
     if (!in_array($changed, $mail_old)) { 
 
      echo 'Address ' . $changed . ' is new.<br />'; 
 
     } 
 
    } 
 
?>

+0

哪舊地址應該被替換?您的示例沒有任何地址在域更改。 – Barmar 2014-11-08 16:21:08

+1

如果在不同域中有兩個具有相同名稱的地址,會發生什麼情況? '[email protected],john @ example2.org'? – Barmar 2014-11-08 16:22:33

+0

我的意思是像「[email protected]」,應該用「[email protected]」取代 – booog 2014-11-08 16:24:24

回答

0

製作一部鍵關閉名稱$mail_old關聯數組:

$mail_by_name = array(); 
foreach ($mail_old as $i => $addr) { 
    list ($name, $domain) = explode('@', $addr); 
    $mail_by_name[$name] = $i; 
} 

然後把新的數組中測試每名反對這樣的:

foreach ($mail_new as $changed) { 
    list($name, $domain) = explode('@', $changed); 
    if (isset($mail_by_name[$name])) { 
     if ($mail_old[$mail_by_name[$name]] != $changed) { 
      echo 'Address ' . $mail_old[$mail_by_name[$name]] . ' changed to ' . $changed . '.</br>'; 
      $mail_old[$mail_by_name[$name]] = $changed; 
     } 
    } else { 
     echo 'Address ' . $changed . ' is new.<br />'; 
    } 
} 
+0

太好了,非常感謝Barmar! – booog 2014-11-08 16:37:35

+0

這個工作,並會得到我無法找到自己的結果。所以對我來說重要的學習部分是創建一個新的數組,而不是尋找各種數組函數。再次感謝你,你幫了我很多,而且速度非常快! – booog 2014-11-08 16:40:58