2015-04-28 62 views
1

在蟒蛇一個名單,我有兩個列表與非唯一值:PHP減去其他

a = [1,2,3,4,5,5,4,3,2,1,2,3,4,5] 

b = [1,2,2,2,5,5] 

要。減去b。從一個 我找到了解決辦法:

from collections import Counter as mset 

subtract = mset(a) - mset(b) 

list(subtract.elements()) 

#result is [1, 3, 3, 3, 4, 4, 4, 5]!!!!!!!! 

如何做同樣的在PHP中? PHP不支持列表。

和array_diff是沒有用的,因爲它會刪除非唯一值

+0

不知道有一個bult式函數爲此,一種方法將過濾數組(請參閱我的答案)。 – Cristik

+0

我回答了你,輸出是不同的。也許我需要潛入php收藏並找到解決方案? – user3345632

回答

2

「功能性」的解決方案:

$a = [1,2,3,4,5,5,4,3,2,1,2,3,4,5]; 
$b = [1,2,2,2,5,5]; 
$bCopy = $b; 
$c = array_filter($a, function($item) use(&$bCopy) { 
    $idx = array_search($item, $bCopy); 
    // remove it from $b if found 
    if($idx !== false) unset($bCopy[$idx]); 
    // keep the item if not found 
    return $idx === false; 
}); 
sort($c); 
print_r($c); 

你需要做的$b副本爲array_filter回調是破壞性關於數組$b。你也需要對結果進行排序,如果你想得到與python完全相同的輸出結果。

+0

輸出是不同 ( [2] => 3 [3] => 4 [6] => 4 [7] => 3 [11] => 3 [12] => 4 ) – user3345632

+0

使用解決方案 – Cristik

+0

我認爲直覺上可以使用最新的PHP版本或php集合的新特性來解決它。不幸的是,我不是程序員,而是企業家。 – user3345632

1

相關答案:

對於您所提供的例子,你可以嘗試以下方法:

$a = [1,2,3,4,5,5,4,3,2,1,2,3,4,5]; 
var_dump($a); 
$b = [1,2,2,2,5,5]; 
var_dump($b); 
$c = array_diff($a, $b); 
var_dump($c); 

它應該給你以下結果:

array (size=14) 
    0 => int 1 
    1 => int 2 
    2 => int 3 
    3 => int 4 
    4 => int 5 
    5 => int 5 
    6 => int 4 
    7 => int 3 
    8 => int 2 
    9 => int 1 
    10 => int 2 
    11 => int 3 
    12 => int 4 
    13 => int 5 
array (size=6) 
    0 => int 1 
    1 => int 2 
    2 => int 2 
    3 => int 2 
    4 => int 5 
    5 => int 5 
array (size=6) 
    2 => int 3 
    3 => int 4 
    6 => int 4 
    7 => int 3 
    11 => int 3 
    12 => int 4 

更新

找到了答案here

我包裹在一個有用的功能的解決方案:

function array_diff_duplicates($array1, $array2) { 
    $counts = array_count_values($array2); 
    $result = array_filter($array1, function($o) use (&$counts) { 
     return empty($counts[$o]) || !$counts[$o]--; 
    }); 
    sort($result, SORT_NUMERIC); 
    return $result; 
} 

嘗試以下操作:

$a = [1,2,3,4,5,5,4,3,2,1,2,3,4,5]; 
$b = [1,2,2,2,5,5]; 
$c = array_diff_duplicates($a, $b); 
var_dump($c); 

給人的預期結果:

array (size=8) 
    0 => int 1 
    1 => int 3 
    2 => int 3 
    3 => int 3 
    4 => int 4 
    5 => int 4 
    6 => int 4 
    7 => int 5 
+0

編號輸出不同。我需要$ result = arrray(1,3,3,4,4,4,5); – user3345632

+0

謝謝,也是很好的解決方案。 – user3345632