2016-12-29 11 views
0

Как сравнить два массива в php?Как сравнить два массива?

$arr1[0] = ['user_id' => 1, 'username' => 'bob']; 
    $arr1[1] = ['user_id' => 2, 'username' => 'tom']; 
    //and 
    $arr2[0] = ['user_id' => 2, 'username' => 'tom']; 
    $arr2[1] = ['user_id' => 3, 'username' => 'john']; 
    $arr2[2] = ['user_id' => 21, 'username' => 'taisha']; 
    $arr2[3] = ['user_id' => 1, 'username' => 'bob']; 

Мне нужно возвращать массив, который не содержит удвоение:

$result[0] = ['user_id' => 3, 'username' => 'john']; 
$result[1] = ['user_id' => 21, 'username' => 'taisha']; 
+0

Вам нужно будет написать функцию, чтобы сделать это. Там нет простого заранее написанного способа. – ChrisG

ответ

2

Я бы просто сделать вложенный цикл Еогеаспа

$tmpArray = array(); 

foreach($newData as $arr2) { 

    $duplicate = false; 
    foreach($oldData as $arr1) { 
    if($arr1['user_id'] === $arr2['user_id'] && $arr1['username'] === $arr2['username']) $duplicate = true; 
    } 

    if($duplicate === false) $tmpArray[] = $arr2; 
} 

Затем вы можете использовать $ tmpArray, как newArray

0

Я сделал функцию по вашему вопросу

function compareArrays($array1,$array2) 
{ 
    $merged_array = array_merge($array1,$array2); 
    $trimmed_array=[]; 
    foreach($merged_array as $array) 
    { 
     $found=false; 
     $index_flag; 
     foreach($trimmed_array as $key=>$tarr) 
     { 
      if($tarr['user_id']==$array['user_id'] && $tarr['username']==$array['username']) 
      { 
       $found=true; 
       $index_flag=$key; 
       break; 
      } 
     } 
     if($found) 
     { 
      array_splice($trimmed_array, $index_flag,1); 
     } 
     else 
     { 
      array_push($trimmed_array,$array); 
     } 
    } 
    return $trimmed_array; 
} 

Я проверил его и получил результат именно ваши, и вы можете назвать это с массивами как-

compareArrays($arr1,$arr2); 
+0

, если вы найдете этот ответ в качестве того, что вы точно ищете, пожалуйста, примите как правильный ответ и вернитесь к –

0

Вы можете использовать стандартные функции для достижения цели:

// Function that sorts element array by key and 
// kinda create string representation (needed for comparing). 
$sortByKeyAndSerialize = function (array $item) { 
    ksort($item); 

    return serialize($item); 
}; 

// Map arrays to arrays of string representation and leave only unique. 
$arr1 = array_unique(array_map($sortByKeyAndSerialize, $arr1)); 
$arr2 = array_unique(array_map($sortByKeyAndSerialize, $arr2)); 

// Merge two arrays together and count values 
// (values become keys and the number of occurances become values). 
$counts = array_count_values(array_merge($arr1, $arr2)); 

// Leave only elements with value of 1 
// (i.e. occured only once). 
$unique = array_filter($counts, function ($item) { 
    return $item === 1; 
}); 

// Grab keys and unserialize them to get initial values. 
$result = array_map('unserialize', array_keys($unique)); 

Вот working demo.

Не стесняйтесь обернуть этот код в функции или что-то еще.

Избегайте использования вложенных циклов в вашем коде, это плохое вуду. И если это возможно, избегайте использования явных петель вообще (например, for, while).

Смежные вопросы