2013-04-01 16 views
5

Ho due array multidimensionali come questo:PHP e 2 array multidimensionale Confronta i basano su due valori chiave

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

e il secondo uno come questo

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

Il mio problema è: voglio cercare $ matrice originale per le corrispondenze in base alle chiavi memberid e type e se memberid e type NON SONO uguali -> Voglio rimuovere quell'array dall'array $ originale. Quindi in questo caso voglio mantenere [0] Array e [2] Array come in $ new array Ho lo stesso memberid e lo stesso tipo dell'originale, ma vorrei rimuovere [1] Array come memberid è lo stesso, ma il tipo è diverso. Quindi il mio finale $ array originale sarà simile a questa:

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

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

risposta

2

Qui si va, appena provato e funziona come previsto.

// 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

senza fare alcuna ipotesi circa i dati, ecco una soluzione inefficiente, O (m * n) se m e n sono le lunghezze dei tuoi array:

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

Tuttavia, sarebbe molto più interessante effettuare ricerche più efficienti. Per esempio, se siamo in grado di assumere v'è al massimo un elemento con un dato memberId in $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; 
Problemi correlati