2013-04-01 93 views
5

我有两个多维数组是这样的: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 
    ) 
) 

我的问题是:我要搜索$基于成员id和类型键的匹配原始数组,如果memberid和类型不相同 - >我想从$原始数组中删除该数组。所以在这种情况下,我想保留数组和[2]数组,因为在$新数组中我有相同的成员ID和原来的相同类型,但我想删除[1]数组,因为成员ID是相同的,但类型是不同的。所以,我最后的$原数组看起来就像这样:

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

[1] => Array 
    (
     [time] => 1364690342 
     [memberid] => 96 
     [type] => single 
    ) 
) 

回答

2

在这里你去,只是测试它和它的作品如预期。

// 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); 
-1

未做有关数据做任何假设,这里是一个低效率的解决方案,O( * ñ)如果ñ是您的阵列的长度:

$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; 

但是,要做更有效的查找会更酷。举例来说,如果我们可以假设存在与给定MEMBERID最多一个元素$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;