2015-04-28 1 views
1

В Python У меня есть два списка с неоднородными значений:PHP вычесть один список из других

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

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

Для вычитать б из я нашел решение:

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 

Update

Найдено ответ 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, 3, 4, 4, 4, 5); – user3345632

+0

Спасибо, также хорошее решение. – user3345632

Смежные вопросы