Как сопоставить / соединить два элемента массива друг с другом и вернуть только один в PHP - PullRequest
0 голосов
/ 27 января 2020

Можно ли сопоставить все email_adr и ad_owner_email и оставить их? Например, [0] и [1] - это совпадение, а [0] или [1] удаляется в отфильтрованном массиве. Это нормально, чтобы получить "взаимное соответствие" для всех ["email_adr"] и ["ad_owner_email"] элементов.

 array(3) {
      [0]=>
      array(3) {
        ["id"]=>
        string(5) "14598"
        ["email_adr"]=>
        string(14) "jos@pl.nuu"
        ["ad_owner_email"]=>
        string(23) "boo@gmail.qom"
      }
      [1]=>
      array(3) {
        ["id"]=>
        string(5) "14598"
        ["email_adr"]=>
        string(23) "boo@gmail.qom"
        ["ad_owner_email"]=>
        string(14) "jos@pl.nuu"
      }
      [2]=>
      array(3) {
        ["id"]=>
        string(5) "14598"
        ["email_adr"]=>
        string(23) "boo@gmail.qom"
        ["ad_owner_email"]=>
        string(21) "pelle@med.nuu"
      }
    }

Желаемый результат:

 array(2) {
          [0]=>
          array(3) {
            ["id"]=>
            string(5) "14598"
            ["email_adr"]=>
            string(23) "boo@gmail.qom"
            ["ad_owner_email"]=>
            string(14) "jos@pl.nuu"
          }
          [1]=>
          array(3) {
            ["id"]=>
            string(5) "14598"
            ["email_adr"]=>
            string(23) "boo@gmail.qom"
            ["ad_owner_email"]=>
            string(21) "pelle@med.nuu"
          }
        }

Ответы [ 2 ]

0 голосов
/ 27 января 2020

На первом шаге вы можете собрать все возможные пары электронной почты в массив $tmp:

foreach($array as $record){
    $tmp1[$record['email_adr']][] = $record['ad_owner_email']; 
}

Это создаст массив, подобный:

Array
(
    [jos@pl.nuu] => Array
        (
            [0] => boo@gmail.qom
        )

    [boo@gmail.qom] => Array
        (
            [0] => pelle@med.nuu
            [1] => jos@pl.nuu
        ) 
)

Теперь вы можете использовать дополнительные логи c:

foreach($array as $ind=>$record){
    if (isset($tmp1[$record['ad_owner_email']]) && !empty($tmp1[$record['ad_owner_email']]) )
    { 
        if (in_array($record['email_adr'],$tmp1[$record['ad_owner_email']])) 
        { 
            // index of current value in $tmp1 array
            $tm1 = array_search($record['ad_owner_email'],$tmp1[$record['email_adr']]); 

            // delete an element from $tmp1 and from $array
            unset($tmp1[$record['email_adr']][$tm1]); 
            unset($array[$ind]);  
        }
    }     
}  

Демо

РЕДАКТИРОВАТЬ В соответствии с запросом ниже

$array = [["id"=>"111","email_adr"=>"AAA","ad_owner_email"=>"BBB"],  
          ["id"=>"111","email_adr"=>"BBB","ad_owner_email"=>"CCC"],
          ["id"=>"111","email_adr"=>"BBB","ad_owner_email"=>"AAA"], <--discarded
          ["id"=>"500","email_adr"=>"QQQ","ad_owner_email"=>"PPP"],  
          ["id"=>"500","email_adr"=>"PPP","ad_owner_email"=>"QQQ"], <--discarded
          ["id"=>"1000","email_adr"=>"PPP","ad_owner_email"=>"QQQ"], <-saved because id=1000 and differs from id=500 
    ];

--------==::Desired result::==-----------
Array
(
    [0] => Array
        (
            [id] => 111
            [email_adr] => AAA
            [ad_owner_email] => BBB
        )

    [1] => Array
        (
            [id] => 111
            [email_adr] => BBB
            [ad_owner_email] => CCC
        )

    [2] => Array
        (
            [id] => 500
            [email_adr] => QQQ
            [ad_owner_email] => PPP
        )
    
     [3] => Array
        (
            [id] => 1000
            [email_adr] => PPP
            [ad_owner_email] => QQQ
        )
)

Вы можете использовать следующие логи c вместо предыдущих:

// removes duplicate elements from multidimentional array
$array = array_unique($array, SORT_REGULAR);

// foreach($array ...) //<-- creating an array $tmp1

foreach($array as $ind=>$record){

    $id       = $record['id'];
    $em_owner = $record['ad_owner_email'];
    $em_adr   = $record['email_adr'];

    if (isset( $tmp1[$id][$em_owner] ) && 
        !empty( $tmp1[$id][$em_owner] ) && 
        in_array( $em_adr,   $tmp1[$id][$em_owner] ) &&
        in_array( $em_owner, $tmp1[$id][$em_adr] )
        )
    {    
        // indexes of pair values (both, direct and vice versa)
        $tm1 = array_search($em_adr,   $tmp1[$id][$em_owner]);
        $tm2 = array_search($em_owner, $tmp1[$id][$em_adr]);

        // index of the row in main data set where these values a placed in defined positions.
        $in = getIndex($array, ['a'=>$em_owner, 'b'=>$em_adr, 'c'=>$id]);

            // removing data about paired values in $tmp1 array and in the main $array 
            unset( $tmp1[$id][$em_adr][$tm2] );  
            unset( $tmp1[$id][$em_owner][$tm1] );  
            unset( $array[$in] );  
    }     
} 

// additional function for receiving index of the row
function getIndex($data,$ne){
    foreach($data as $key=>$val){
        if ($val['id'] === $ne['c'] && $val['email_adr'] === $ne['a'] && $val['ad_owner_email'] === $ne['b']) return $key;
    }
    return -1;
}

Demo2

Если у вас проблема с SORT_REGULAR, вы можете использовать следующий код вместо упомянутого array_unique():

$array = array_map("unserialize", array_unique(array_map("serialize", $array)));
0 голосов
/ 27 января 2020

Это может помочь вам на вашем пути. Взяв исходный массив, $arr мы проведем oop через все элементы и сравним email_adr с ad_owner_email следующим образом:

foreach($arr as $key => $value) {
    if(isset($arr[$key+1])) {
        if ($value['email_adr'] == $arr[$key + 1]['ad_owner_email']) {
            unset($arr[$key]);
        }
    }
}

, работающий демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...