Php 将数组与特定键合并

Php 将数组与特定键合并,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,如何合并具有相同密钥“email”的阵列。像这个例子[4]和[6]有相同的电子邮件地址 Array ( [0] => Array ( [email] => test01@laposte.net [gender] => m [lastname] => Canvas [firstname] => Peter [birthdate

如何合并具有相同密钥“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
        )

)
进入

谢谢你

关于这一点,彼得(Peter)

类似的东西(例如,未经测试):

如果我正确理解了您的示例,在您收到一封电子邮件
qsdqs@laposte.net
,您需要在同一封电子邮件中放弃以下内容

这应该做到:

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

很容易找到具有相同电子邮件地址的成员数组并“合并”它们,挑战在于决定如何覆盖其他字段

如果使用
array\u merge()
,后面的值将始终优先,但这可能不是您想要的-在您提供的示例中,生成的数组包含来自第一个数组的一些值和来自第二个数组的一些值(vol6t3键的值来自第一个数组,而lastname和firstname键则来自第二个数组)

在我的脑海中,你必须循环浏览数据,以收集具有相同电子邮件地址的所有文章的列表,然后循环浏览该列表,并根据每个字段的决定合并数据,我真的无法帮助你

其中一些可能很简单-如果字段在一个数组中有数据,而在另一个数组中没有数据(如“vol6t3”键),则您可以使用带有数据的字段。但是,如果字段在两个数组中都有数据,则您必须决定保留哪些数据和放弃哪些数据(或者您可以保留这两个数据并将字段转换为数组)


如果您愿意,我将提供一个代码示例,但我需要一些时间来编写它。

谢谢大家,特别感谢Stanislav Shabalin,他真的帮助了我

我编写了成功运行的函数:)如下:

/** *得到一个清晰的多维数组 * *@param数组$array *数组到不同的 *@param string$keySearch *用于搜索双数组的字符串键 *@param boolean$overwrite=false *允许覆盖值的布尔值 *@param array$exception=array() *如果覆盖为true,则不覆盖的密钥数组 * *@return数组$result *返回一个多维数组,该数组已被区分。 */ 公共静态函数distinctMultiDimensionalArray($array,$keySearch,$overwrite=false,$exception=array()) { //检查它是否是数组 如果(!is_数组($array)) 返回false; $result=array(); foreach($array作为$entry) { //如果电子邮件不存在 如果(!isset($result[$entry[$keySearch]])) $result[$entry[$keySearch]]=$entry; 其他的 { //如果存在电子邮件 foreach($key=>$value作为条目) { 如果(!空($value)) { //如果不是空值,并且此值与以前不同,您不希望覆盖这些值 //或者要覆盖除某些键以外的值 如果((!empty($result[$entry[$keySearch]][$key]) &&$result[$entry[$keySearch][$key]!=$value &&$overwrite==false) || ($overwrite==true) &&在数组中($key,$exception))) $result[$entry[$keySearch][$key]=$result[$entry[$keySearch]][$key].','.$value; 其他的 $result[$entry[$keySearch][$key]=$value; } } } } $result=数组_值($result); 返回$result; }
非常感谢

[4]和[6]具有相同的电子邮件地址,但数据不同。你怎么知道该保留哪些数据,该丢弃哪些数据?@Nimbus147:我不明白你的问题如果@Stanislav Shabalin帮了你很多忙,那么你应该接受他的回答。这就是OP向SO社区表示特别感谢和回馈的方式。
foreach( $first_array as $key => &$value) {
  if ($value['email'] == $second_array[$key]['email']) {
    array_merge($value, $second_array[$key]);
  }
}
$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);
$result = array();
foreach ($arr as $entry) {
    if (!isset($result[$entry['email']])) {
        $result[$entry['email']] = $entry;
    }
}
$result = array_values($result);
/** * 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; }