2014-10-24 6 views
0

У меня есть массив следующим образомнайти все значения дубликатов в многомерном массиве PHP

array(
    0 => array('email' => '[email protected]','name'=>'abc'), 
    1 => array('email' => '[email protected]','name'=>'xyz'), 
    2 => array('email' => '[email protected]','name'=>'uvw'), 
    3 => array('email' => '[email protected]','name'=>'str'), 
) 

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

array(
    0 => array(
    array(
     0 => array('email' => '[email protected]','name'=>'abc'), 
     1 => array('email' => '[email protected]','name'=>'str'), 
    ) 
) 

Мой код

$tmpArray = array(); 
    $duplicateRecords = array(); 
    if (empty($data)) { 
     return false; 
    } 

    foreach ($data as $key => $value) { 

     if (in_array($value['Email'], $tmpArray)) { 
      $duplicateRecords[] = $value; 
     } 
     $tmpArray[] = $value['Email']; 
    } 

    echo '<pre>';print_r($duplicateRecords);die; 

Но этот кусок кода только возвращает запись однажды существования, который второй раз. Я знаю, когда в первый раз он не просматривает электронную почту. Есть ли способ получить существование записи столько раз, сколько в массиве.

+0

Итак, вы хотите, чтобы сгруппировать элементы вашего массива, сами массивы, по значению их ключа "электронной почты" , –

+0

@LightnessRacesinOrbit Да, я хочу группировать элементы массива с одинаковым адресом электронной почты –

ответ

1
// get count of each email 
$counters = array_count_values(array_column($data, 'email')); 

// collect email with counter > 1 
$result = []; 
foreach ($data as $item) { 
    if ($counters[$item['email']] > 1) { 
     $result[] = $item; 
    } 
} 
+0

'array_column', доступный с php5.5 –

+0

@Vleonov, Привет. Я обновил свой вопрос относительно результирующего формата массива. Если я хочу получить результирующий массив как 'array ( 0 => array ( array ( 0 => массив ('email' => '[email protected]', 'name' => 'abc'), 1 = > array ('email' => '[email protected]', 'name' => 'str'), ) ) ', чтобы иметь несколько значений? –

+0

@AwaisQarni, затем выполните следующее: $ result [$ item [ 'email'] [] = $ item; Он будет группировать массив по электронной почте, как вы пожелаете – vleonov

1

Это один должен работать для вас:

foreach($array as $key => $value) { 
    foreach ($array as $k => $v) { 
     if ($key < $k && $value['email'] == $v['email']) { 
      $result[] = array(
       $value, 
       $v 
      ); 
     } 
    } 
} 

PHPFiddle Ссылка: http://phpfiddle.org/main/code/8trq-k2zc

Пожалуйста, обратите внимание: это было бы только найти вам конфликтующие пары. Например:

$array = array(
    array(
     'email' => '[email protected]', 
     'name' => 'abc' 
    ), 
    array(
     'email' => '[email protected]', 
     'name' => 'def' 
    ), 
    array(
     'email' => '[email protected]', 
     'name' => 'ghi' 
    ) 
); 

приведет ли:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [email] => [email protected] 
        [name] => abc 
       ) 

      [1] => Array 
       (
        [email] => [email protected] 
        [name] => def 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [email] => [email protected] 
        [name] => abc 
       ) 

      [1] => Array 
       (
        [email] => [email protected] 
        [name] => ghi 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [email] => [email protected] 
        [name] => def 
       ) 

      [1] => Array 
       (
        [email] => [email protected] 
        [name] => ghi 
       ) 

     ) 

) 

Так abc конфликты с def, abc конфликтов с ghi и def конфликтов с ghi.

1

Это решение «двух проходов». Код прокомментирован.

PHP 5.3.18

<?php // https://stackoverflow.com/questions/26548634/find-all-duplicates-values-in-multi-dimensional-array-php 

$data = array(
    0 => array('email' => '[email protected]','name'=>'abc'), 
    1 => array('email' => '[email protected]','name'=>'xyz'), 
    2 => array('email' => '[email protected]','name'=>'uvw'), 
    3 => array('email' => '[email protected]','name'=>'str'), 
); 

// two passes required 

// first pass: count of emails 
$emailCounts = array(); 

foreach($data as $emailEntry) { 
    if (isset($emailCounts[$emailEntry['email']])) { 
     $emailCounts[$emailEntry['email']] += 1; 
    } 
    else { 
     $emailCounts[$emailEntry['email']] = 1; 
    } 
} 

// second pass: extract duplicate emails (count > 1) 
$duplicateEmails = array(); 

foreach($data as $emailEntry) { 
    if ($emailCounts[$emailEntry['email']] > 1) { 
     $duplicateEmails[] = $emailEntry; 
    } 
} 

// show output... 
var_dump($emailCounts); 

var_dump($duplicateEmails); 

Фактический выход:

array 
    '[email protected]' => int 2 
    '[email protected]' => int 1 
    '[email protected]' => int 1 

array 
    0 => 
    array 
     'email' => string '[email protected]' (length=11) 
     'name' => string 'abc' (length=3) 
    1 => 
    array 
     'email' => string '[email protected]' (length=11) 
     'name' => string 'str' (length=3) 
0
Here is the code for you 
>$mainarray=array(
    0 => array('email' => '[email protected]','name'=>'abc'), 
1 => array('email' => '[email protected]','name'=>'xyz'), 
2 => array('email' => '[email protected]','name'=>'uvw'), 
3 => array('email' => '[email protected]','name'=>'str'), 
); 

foreach($mainarray as $single){ 
$emailarray[]=$single['email']; 
} 
foreach(array_count_values($emailarray) as $val => $c) 
    if($c > 1) $dups[] = $val; 

foreach($mainarray as $single){ 
    if(in_array($single['email'], $dups)){ 
     $result[]=$single; 
    } 
} 
    echo '<pre>';print_r($result);