2011-08-17 112 views
0

如何合併具有相同鍵'email'的數組。像這個例子[4]和[6]有相同的電子郵件地址。用特定鍵合併陣列

Array 
(
    [0] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => Canvas 
      [firstname] => Peter 
      [birthdate] => 1987-09-13 
      [country] => DE 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => yes 
      [date] => 2011-08-11 15:41:54 
      [vol6t3] => L'homme de bernadette 
      [uwwpma] => 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 1 
     ) 

    [1] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => Canvas 
      [firstname] => Peter 
      [birthdate] => 1987-09-13 
      [country] => DZ 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => yes 
      [date] => 2011-08-11 15:42:50 
      [vol6t3] => L'homme de bernadette 
      [uwwpma] => 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 1 
     ) 

    [2] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => qsd 
      [firstname] => qsd 
      [birthdate] => 1981-01-17 
      [country] => AT 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => 
      [date] => 2011-08-11 15:43:22 
      [vol6t3] => Un militant de gauche 
      [uwwpma] => 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 1 
     ) 

    [3] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => qsd 
      [firstname] => qsdqsd 
      [birthdate] => 1982-02-19 
      [country] => BS 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => 
      [date] => 2011-08-11 15:45:13 
      [vol6t3] => Un militant de gauche 
      [uwwpma] => 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 1 
     ) 

    [4] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => qds 
      [firstname] => dqs 
      [birthdate] => 1980-11-19 
      [country] => BS 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => 
      [date] => 2011-08-11 15:46:14 
      [vol6t3] => Un militant de gauche 
      [uwwpma] => 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 1 
     ) 

    [5] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => Canvas 
      [firstname] => Peter 
      [birthdate] => 1987-09-13 
      [country] => DE 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => yes 
      [date] => 2011-08-11 15:47:11 
      [vol6t3] => L'homme de bernadette 
      [uwwpma] => 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 1 
     ) 

    [6] => Array 
     (
      [email] => [email protected] 
      [gender] => m 
      [lastname] => Canvas 
      [firstname] => Peter 
      [birthdate] => 1987-09-13 
      [country] => DE 
      [xgfx3r] => 
      [language] => fr_FR 
      [newsletter] => 0 
      [newsletter_partner] => 0 
      [facebook_login] => yes 
      [date] => 2011-08-11 15:48:35 
      [vol6t3] => 
      [uwwpma] => Toi 
      [bhqgzn] => 
      [nb_email_shared] => 
      [period] => 2 
     ) 

) 

Array 
    (
     [0] => Array 
      (
       [email] => [email protected] 
       [gender] => m 
       [lastname] => Canvas 
       [firstname] => Peter 
       [birthdate] => 1987-09-13 
       [country] => DE 
       [xgfx3r] => 
       [language] => fr_FR 
       [newsletter] => 0 
       [newsletter_partner] => 0 
       [facebook_login] => yes 
       [date] => 2011-08-11 15:41:54 
       [vol6t3] => L'homme de bernadette 
       [uwwpma] => 
       [bhqgzn] => 
       [nb_email_shared] => 
       [period] => 1 
      ) 

     [1] => Array 
      (
       [email] => [email protected] 
       [gender] => m 
       [lastname] => Canvas 
       [firstname] => Peter 
       [birthdate] => 1987-09-13 
       [country] => DZ 
       [xgfx3r] => 
       [language] => fr_FR 
       [newsletter] => 0 
       [newsletter_partner] => 0 
       [facebook_login] => yes 
       [date] => 2011-08-11 15:42:50 
       [vol6t3] => L'homme de bernadette 
       [uwwpma] => 
       [bhqgzn] => 
       [nb_email_shared] => 
       [period] => 1 
      ) 

     [2] => Array 
      (
       [email] => [email protected] 
       [gender] => m 
       [lastname] => qsd 
       [firstname] => qsd 
       [birthdate] => 1981-01-17 
       [country] => AT 
       [xgfx3r] => 
       [language] => fr_FR 
       [newsletter] => 0 
       [newsletter_partner] => 0 
       [facebook_login] => 
       [date] => 2011-08-11 15:43:22 
       [vol6t3] => Un militant de gauche 
       [uwwpma] => 
       [bhqgzn] => 
       [nb_email_shared] => 
       [period] => 1 
      ) 

     [3] => Array 
      (
       [email] => [email protected] 
       [gender] => m 
       [lastname] => qsd 
       [firstname] => qsdqsd 
       [birthdate] => 1982-02-19 
       [country] => BS 
       [xgfx3r] => 
       [language] => fr_FR 
       [newsletter] => 0 
       [newsletter_partner] => 0 
       [facebook_login] => 
       [date] => 2011-08-11 15:45:13 
       [vol6t3] => Un militant de gauche 
       [uwwpma] => 
       [bhqgzn] => 
       [nb_email_shared] => 
       [period] => 1 
      ) 

     [4] => Array 
      (
       [email] => [email protected] 
       [gender] => m 
       [lastname] => qds 
       [firstname] => dqs 
       [birthdate] => 1980-11-19 
       [country] => BS 
       [xgfx3r] => 
       [language] => fr_FR 
       [newsletter] => 0 
       [newsletter_partner] => 0 
       [facebook_login] => 
       [date] => 2011-08-11 15:46:14 
       [vol6t3] => Un militant de gauche 
       [uwwpma] => Toi 
       [bhqgzn] => 
       [nb_email_shared] => 
       [period] => 2 
      ) 

     [5] => Array 
      (
       [email] => [email protected] 
       [gender] => m 
       [lastname] => Canvas 
       [firstname] => Peter 
       [birthdate] => 1987-09-13 
       [country] => DE 
       [xgfx3r] => 
       [language] => fr_FR 
       [newsletter] => 0 
       [newsletter_partner] => 0 
       [facebook_login] => yes 
       [date] => 2011-08-11 15:47:11 
       [vol6t3] => L'homme de bernadette 
       [uwwpma] => 
       [bhqgzn] => 
       [nb_email_shared] => 
       [period] => 1 
      ) 
    ) 

非常感謝之前!

方面,彼得

+2

[4]和[6]具有相同的電子郵件地址,但不同的數據。您如何知道要保留哪些數據以及要丟棄哪些數據? – NightHawk

回答

1

如果我明白你的例如正確,你已經有了一個條目後電子郵件[email protected],您需要使用同一封電子郵件丟棄任何內容。

應該這樣做:

$result = array(); 
foreach ($arr as $entry) { 
    if (!isset($result[$entry['email']])) { 
     $result[$entry['email']] = $entry; 
    } 
} 
$result = array_values($result); 
0

像這樣(沒有測試過,只是舉例):

foreach($first_array as $key => &$value) { 
    if ($value['email'] == $second_array[$key]['email']) { 
    array_merge($value, $second_array[$key]); 
    } 
} 
0
$merged = [] 
foreach($arr as $v){ 
    $e = $v['email']; 
    if(array_key_exists($merged[$e]){ 
     $merged[$e] = array_merge($v,$merged[$i]); 
    }else{ 
     $merged[$e] = $v; 
    } 
} 

// Merged will now be an associative array with the e-mail addresses as keys 
// if you want to use it as a normal array use 
$merged = array_values($merged); 
+0

我怎樣纔能有$ i? – prcaen

+0

@ Nimbus147:我不明白你的問題 – GWW

0

這是很容易找到具有相同的電子郵件地址和「合併」他們成員陣列,面臨的挑戰是決定其他字段是如何被覆蓋。

如果使用array_merge()後來值將始終優先,但是這可能不是你想要的東西 - 你所提供的示例中,所產生的陣列從第一陣列具有一定的價值,有的從第二(即「vol6t3 '鍵具有第一個數組的值,但'lastname'和'firstname'鍵取自第二個數組)。

關閉我的頭頂,你將不得不循環訪問數據來收集所有文章的列表,使用相同的電子郵件地址,然後循環訪問該列表併合並基於每場決定的數據真的幫不了你。

有些會很容易 - 如果字段在一個陣列中有數據,並在其他沒有數據(如「vol6t3」鍵),你會採取一個數據。但是,如果該字段在兩個數組中都有數據,則必須決定要保留哪些數據以及要放棄哪些數據(或者可以保留兩者並將該字段變爲數組)。

我會提供一個代碼示例,如果你喜歡,但它會帶我一段時間來寫吧...

0

感謝所有,並特別感謝到斯坦尼斯Shabalin誰真正幫助我。

我寫我的功能,成功運行:)波紋管:

 

    /** 
     * Get a distinct multi dimensional array 
     * 
     * @param array $array 
     * array to distinct 
     * @param string $keySearch 
     * string key to search double array 
     * @param boolean $overwrite = false 
     * boolean to allow values to be overwritten 
     * @param array $exception = array() 
     * array of keys to not overwrite if overwrite is true 
     * 
     * @return array $result 
     * Return a multi dimensional array witch has been distinct. 
     */ 
    public static function distinctMultiDimensionalArray($array, $keySearch, $overwrite = false, $exception = array()) 
    { 

     // Check if it's an array 
     if(!is_array($array)) 
     return false; 

     $result = array(); 

     foreach ($array as $entry) 
     { 
     // If email doesn't exist 
     if (!isset($result[$entry[$keySearch]])) 
      $result[$entry[$keySearch]] = $entry; 
     else 
     { 
      // If email exist 
      foreach ($entry as $key => $value) 
      { 
      if(!empty($value)) 
      { 
       // If not empty value and this value is different from before and you don't want to overwrite values 
       // Or you want to overwrite values except some keys 
       if((!empty($result[$entry[$keySearch]][$key]) 
        && $result[$entry[$keySearch]][$key] != $value 
        && $overwrite == false) 
       || 
        ($overwrite == true 
        && in_array($key, $exception))) 
       $result[$entry[$keySearch]][$key] = $result[$entry[$keySearch]][$key] . ', ' . $value; 
       else 
       $result[$entry[$keySearch]][$key] = $value; 
      } 


      } 
     } 
     } 
     $result = array_values($result); 

     return $result; 
    } 

非常感謝!

+1

如果@Stanislav Shabalin幫助你很多,那麼你就應該接受他的答案。這就是OP如何表示特別感謝並回饋給SO社區。 – momo