PHP - 包含两个数组的最小合并

时间:2013-08-06 03:22:19

标签: php arrays merge

我不知道如何解释这一点。一个例子似乎是最简单的方法:

[1, 4, 7, 3, 3, 3] and [4, 0, 3, 4, 9, 9]
should give [0, 1, 3, 3, 3, 4, 4, 7, 9, 9]

添加两个数组的每个元素。如果某个元素都在两个数组中,则在单个数组中添加该元素的最大数量。生成的数组不需要以任何特殊方式排序,但为了便于阅读,我在这里做了。

注意,这将用于具有未知整数值的大数组。有没有一种好的方法可以做到这一点,不需要太多的时间/处理能力?

4 个答案:

答案 0 :(得分:0)

<强>算法:

  1. 将最小的数组复制到解决方案数组中。

  2. 遍历另一个数组。

  3. 如果找到新元素=&gt;

    使用此链接计算元素在另一个数组Count how often a particular value appears in an array中出现的次数。添加相同的内容。

  4. 如果找到的元素已存在于结果数组中,请找到该元素的计数。

    if(在其他数组中计算&gt; =结果数组中的count)

    将(在其他数组中计数 - 在结果数组中计数)*元素添加到结果数组。

    其他:什么都不做。

  5. 这是上述算法的工作php实现:

    <?php
    $a1=[1, 4, 7, 3, 3, 3];
    $a2=[4, 0, 3, 4, 9, 9];
    $size=sizeof($a1);
    $result=$a1;
    foreach ($a2 as $value)
    {
    if(in_array($value,$result))
    {
        $p=array_count_values($a2)[$value] ;
        $q=array_count_values($result)[$value] ;
        if($p>$q)
         {
             $temp=array_fill(0, $p-$q  , $value);
             $result=array_merge($result,$temp);
         }
    }
    else
    {
        $temp=array_fill(0,array_count_values($a2)[$value],$value);
        $result=array_merge($result,$temp);
    }
    }
    print_r($result);
    
    ?>
    

    这是输出:

    Array
    (
        [0] => 1
        [1] => 4
        [2] => 7
        [3] => 3
        [4] => 3
        [5] => 3
        [6] => 4
        [7] => 0
        [8] => 9
        [9] => 9
    )
    

    我是否回答了你的问题?

答案 1 :(得分:0)

可能不是最优化但

<?php
$one=[1, 4, 7, 3, 3, 3];
$two=[4, 0, 3, 4, 9, 9];
sort($one);
sort($two);
foreach($one as $el)
{
$combined[]=$el;
if (array_search($el,$two))
{
unset($two[array_search($el,$two)]);
}
}
foreach($two as $el)
{
$combined[]=$el;
}
sort($combined);
print_r($combined);
?>

答案 2 :(得分:0)

试试这个:

<?php

$array1 = [1, 4, 7, 3, 3, 3];
$array2 = [4, 0, 3, 4, 9, 9];

function min_merge($arr1, $arr2) {
    $arr1 = array_count_values($arr1);
    $arr2 = array_count_values($arr2);

    foreach ($arr2 as $index => $arr)
        if (!isset($arr1[$index]) || $arr > $arr1[$index])
            $arr1[$index] = $arr;

    foreach ($arr1 as $index => $arr)
        for ($i = 0; $i < $arr; $i++)
            $final[] = $index;

    return $final;
}

print_r(min_merge($array1, $array2));

Output

Array (
    [0] => 1
    [1] => 4
    [2] => 4
    [3] => 7
    [4] => 3
    [5] => 3
    [6] => 3
    [7] => 0
    [8] => 9
    [9] => 9 
)

未排序,但它包含[0, 1, 3, 3, 3, 4, 4, 7, 9, 9]中的所有数字。

答案 3 :(得分:0)

$count[0] = array_count_values($arr1);
$count[1] = array_count_values($arr2);
$out = array();
array_map(function($e) use(&$out, $count){
    $n1 = (isset($count[0][$e])) ? $count[0][$e] : 0;
    $n2 = (isset($count[1][$e])) ? $count[1][$e] : 0;
    $next = ($n2 > $n1) ? array_fill(0, $n2, $e) : array_fill(0, $n1, $e);
    $out = array_merge($out, $next);
}, array_keys($count[0] + $count[1]));
print_r($out);