2013-04-01 16 views
5

mam dwie tablice wielowymiarowe tak:PHP i 2 wielowymiarowa tablica porównanie opiera się na dwóch podstawowych wartościach

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

i drugi podobny do tego

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

mój problem jest: Chcę Szukaj $ oryginalna tablica dla dopasowań oparta na kluczach memberid i type oraz jeśli memberid i type NIE są takie same -> Chcę usunąć tablicę z oryginalnej tablicy $. Tak więc w tym przypadku chcę zachować [0] Array i [2] Array jak w $ new array Mam ten sam memberid i ten sam typ co w oryginale, ale chciałabym usunąć [1] Array, ponieważ memberid jest taki sam, ale typ jest inny. Więc moja ostateczna $ oryginalna tablica będzie wyglądać następująco:

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

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

Odpowiedz

2

Proszę, tylko przetestowane i działa zgodnie z oczekiwaniami.

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

bez dokonywania żadnych założeń o danych, tutaj jest to nieefektywne rozwiązanie, O (m * n) jeżeli m i n są długości twoich tablic:

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

Jednak byłoby o wiele chłodniej robić bardziej wydajne wyszukiwania. Na przykład, jeśli możemy założyć, istnieje co najwyżej jeden element o danym memberid w $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; 
Powiązane problemy