2017-06-04 63 views
1

我希望有一点帮助。我试过array_diff(),相交组合,但无法获得预期的回报。PHP - array_diff所有相似的值进行比较和删除

这是我想要做的一个例子。第一组数组。

Array 
(
    [0] => 21 
    [1] => 2 
    [2] => 1 
    [3] => 2 
) 

二阵列

Array 
(
    [0] => 21 
    [1] => 2 
) 

使用array_diff(firstarray, secondarray)我获得以下。

Array 
(
    [2] => 1 
) 

但我想从firstarray

Array 
(
    [2] => 1 
    [3] => 2 
) 

键和secondarray惯于一定是相同的。

+3

你必须写自己的函数来做到这一点 –

+0

竟被为什么你想要2也? –

回答

0

这个小片段应该可以帮助你实现你想要的。这里我们将循环第二个数组,并从第一个数组中删除第一次出现的每个值。从$first

$first = array(0 => 21, 1 => 2, 2 => 1, 3 => 2); 
$second = array(0 => 21, 1 => 2); 

foreach ($second as $v) { 
    unset($first[array_search($v, $first)]); 
} 

输出循环后:

Array 
(
    [2] => 1 
    [3] => 2 
) 

如果您想保留$first排列完好,将其复制到其他变量,环路,即$new = $first;$new未设置的,而不是$first

Live demo

0
function array_true_diff($arrayOne, $arrayTwo = []) { 
    if (count($arrayOne) < count($arrayTwo)) { 
     $tmp = $arrayOne; 
     $arrayOne = $arrayTwo; 
     $arrayTwo = $tmp; 
    } 

    $diffs = []; 
    foreach ($arrayOne as $key => $value) { 
     if (!isset($arrayTwo[$key]) || $arrayTwo[$key] !== $value) { 
      $diffs[$key] = $value; 
     } 
    } 
    return $diffs; 
} 

print_r(array_true_diff(firstarray, secondarray))

以上的功能能够满足您的要求。

在这种情况下,你可以使用“in_array”,以检查是否存在与“array_search”拿到钥匙和“未设置”从数组这样删除元素
0

$array1 = array(21, 2, 1, 2); 
    $array2 = array(21, 2); 
    $result = array(); 
    for ($i=0; $i < count($array1) ; $i++) { 
     if (in_array($array1[$i], $array2)) { 
      unset($array2[array_search($array1[$i], $array2)]); 
     } else { 
      array_push($result,$array1[$i]); 
     } 
    } 

和输出将是:

Array ([0] => 1 [1] => 2) 
0

试试下面的功能:

function arrayDiff($a, $b) { 

    $a = array_count_values($a); 
    $b = array_count_values($b); 

    $out = array(); 

    foreach($a as $key => $value) { 

     if(isset($b[ $key ])) { 
      $value -= $b[ $key ]; 
     } 

     $out = array_merge($out, array_fill(0, $value, $key)); 
    } 

    return $out; 
} 

print_r(arrayDiff($a, $b));