Сравнение PHP и 2 многомерных массивов на основе двух ключевых значений

У меня есть две многомерные массивы:

$original = Array ( [0] => Array ( [time] => 1364690340 [memberid] => 90 [type] => single ) [1] => Array ( [time] => 1364690341 [memberid] => 92 [type] => fixed ) [2] => Array ( [time] => 1364690342 [memberid] => 96 [type] => single ) ) 

и второй подобный этому

 $new = Array ( [0] => Array ( [time] => 1364825750 [memberid] => 90 [type] => single ) [1] => Array ( [time] => 1364825751 [memberid] => 92 [type] => single ) [2] => Array ( [time] => 1364825752 [memberid] => 96 [type] => single ) [3] => Array ( [time] => 1364825753 [memberid] => 111 [type] => single ) ) 

Моя проблема заключается в следующем: я хочу искать $ original array для совпадений на основе memberid и type keys, а если memberid и тип ARE NOT – то же самое -> я хочу удалить этот массив из $ original array. Поэтому в этом случае я хочу сохранить [0] Array и [2] Array, как в $ new array. У меня есть тот же член и тот же тип, что и в оригинале, но я бы хотел удалить [1] Array, поскольку memberid одинаковый, но тип другой. Таким образом, мой окончательный $ original массив будет выглядеть так:

 $original = Array ( [0] => Array ( [time] => 1364690340 [memberid] => 90 [type] => single ) [1] => Array ( [time] => 1364690342 [memberid] => 96 [type] => single ) ) 

Здесь вы идете, просто протестировали его, и он работает так, как ожидалось.

 // Presuming your two arrays are still called $new & $original $original = array(); // your data $new = array(); // your data $newArray = array(); foreach($original AS $key => $val){ $newArray[$val['memberid'] . '-' . $val['type']] = $val; } $original = array(); foreach($new AS $key => $val){ if(isset($newArray[$val['memberid'] . '-' . $val['type']])){ $original[] = $newArray[$val['memberid'] . '-' . $val['type']]; } } print_r($original); 

Без каких-либо предположений о ваших данных, это неэффективное решение, O ( m * n ), если m и n – длины ваших массивов:

 $new_original = array(); foreach ($original as $elem) { // let's see if $new has something with the same type and memberid foreach ($new as $candidate) { if ($candidate['type'] == $elem['type'] && $candidate['memberid'] == $elem['memberid']) { // it does! let's keep $elem $new_original[] = $elem; } } } // reassign it to $original if desired $original = $new_original; 

Тем не менее, было бы намного более прохладно делать более эффективные поиски. Например, если мы можем предположить, что существует не более одного элемента с заданным членом в $new :

 // turn $new into a map $new_as_map = array(); foreach ($new as $candidate) { $new_as_map[$candidate['memberid']] = $candidate; } $new_original = array(); foreach ($original as $elem) { if (isset($new_as_map[$elem['memberid']])) { $candidate = $new_as_map[$elem['memberid']]; if ($candidate['type'] == $elem['type']) { $new_original[] = $elem; } } } // reassign it to $original if desired $original = $new_original;