Объединить массив с определенным ключом - PullRequest
0 голосов
/ 17 августа 2011

Как объединить массивы с одним и тем же ключом 'email'.Как и в этом примере [4] и [6] имеют один и тот же адрес электронной почты.

Array
(
    [0] => Array
        (
            [email] => test01@laposte.net
            [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] => test@laposte.net
            [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] => sqd@test.com
            [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] => qsd@laposte.net
            [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] => qsdqs@laposte.net
            [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] => lol@laposte.net
            [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] => qsdqs@laposte.net
            [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] => test01@laposte.net
                [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] => test@laposte.net
                [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] => sqd@test.com
                [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] => qsd@laposte.net
                [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] => qsdqs@laposte.net
                [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] => lol@laposte.net
                [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
            )
    )

Большое спасибо раньше!

, Питер

Ответы [ 5 ]

1 голос
/ 17 августа 2011

Если я правильно понял ваш пример , после того, как вы получили одну запись с электронным письмом qsdqs@laposte.net, вам нужно отбросить все, что следует за тем же электронным письмом.

Это должно сделать это:

$result = array();
foreach ($arr as $entry) {
    if (!isset($result[$entry['email']])) {
        $result[$entry['email']] = $entry;
    }
}
$result = array_values($result);
0 голосов
/ 18 августа 2011

Спасибо всем и особая благодарность Станиславу Шабалину, который действительно помогает мне.

Я пишу свою функцию, которая успешно выполняется :) ниже:


    /**
       * 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;
    }

Большое спасибо!

0 голосов
/ 17 августа 2011

Довольно просто найти массивы элементов с тем же адресом электронной почты и «объединить» их, задача состоит в том, чтобы решить, как будут перезаписаны другие поля.

Если вы используете array_merge(), более поздние значения будутвсегда имеет приоритет, но это может быть не тем, что вы хотите - в приведенном вами примере результирующий массив имеет некоторые значения из первого массива и некоторые из второго (ключ 'vol6t3' имеет значение из первого массива, ноключи 'lastname' и 'firstname' берутся из второго).

Вверху моей головы вам придется просмотреть данные, чтобы собрать список всех статей с одним и тем же адресом электронной почты, затемпереберите этот список и объедините данные, основываясь на решении для каждого поля, с которым я действительно не могу помочь.

Некоторые из них были бы просты - если поле содержит данные в одном массиве и нет данных вдругой (например, ключ 'vol6t3') вы бы взяли тот, который содержит данные.Но если поле содержит данные в обоих массивах, вам придется решить, какие данные сохранить, а какие отбросить (или вы можете сохранить оба и превратить поле в массив).

Я приведу пример кодаесли хотите, но мне потребуется некоторое время, чтобы написать это ...

0 голосов
/ 17 августа 2011
$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 голосов
/ 17 августа 2011

как-то так (не проверено, например):

foreach( $first_array as $key => &$value) {
  if ($value['email'] == $second_array[$key]['email']) {
    array_merge($value, $second_array[$key]);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...