【问题标题】:PHP - Minimal merge that contains both arraysPHP - 包含两个数组的最小合并
【发布时间】:2013-08-06 22:29:20
【问题描述】:

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

[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]

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

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

【问题讨论】:

  • 你研究过数组排序和合并函数吗?
  • 我不知道您所说的“在单个数组中添加该元素的最大数量”是什么意思
  • @Mike:有根据的猜测。第一个数组中有三个 3。第二个数组中只有一个 3。 3s 的“最大数量”是 3,因此生成的数组应该包含[...3, 3, 3, ...]
  • @MikeSherrill'Catcall' 感谢您的解释。看起来 OP 已经消失了。

标签: php arrays merge


【解决方案1】:

算法:

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

  2. 遍历另一个数组。

  3. 如果找到新元素=>

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

  4. 如果发现一个元素已经存在于结果数组中,则查找该元素的计数。

    如果(其他数组中的计数>=结果数组中的计数)

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

    否则:什么都不做。

这是上述算法的工作 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
)

我回答你的问题了吗?

【讨论】:

    【解决方案2】:

    可能不是最优化的,但

    <?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);
    ?>
    

    【讨论】:

      【解决方案3】:

      试试这个:

      <?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] 的所有数字。

      【讨论】:

      • 你可以在最后做 asort() ,然后是 array_values() (如果还需要对索引进行排序)
      • OP 说的是the resulting array needs not be sorted,所以我就原样保留了它。
      【解决方案4】:
      $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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 2021-11-26
        • 2018-12-17
        • 1970-01-01
        • 2019-02-22
        • 2015-01-26
        • 2011-02-22
        相关资源
        最近更新 更多