【问题标题】:PHP - array_merge without considering keysPHP - array_merge 不考虑键
【发布时间】:2014-03-12 16:01:45
【问题描述】:

我需要 php 数组合并方面的帮助

我需要按值合并,

所以如果我在数组 1 中有这样的值

 ( room room )  and in array values  ( room ) , merge will look like this =  ( room room ) 

如果我有

 ( room room book ) and ( book book ) merged array values will look like this  ( room room book book ) 

可以说,合并后的数组值将是所有数组中每个元素的最大计数,例如房间

再举几个例子, (书)(书)(书)=(书) (书房书)(书房)=(书房书书) (房间书房)(书房书书) = (房书房书书) (房间) (房间) (房间房间房间) = (房间房间房间)

我尝试了 operator + ,但后来

(room room)(book book book)是(room room book book),那个不好

我试过 array_merge ,但后来

(房间)(房间)是(房间),这没关系 但 (房间房间)(房间)是(房间房间房间),这是错误的

它不依赖于顺序,键也不重要,它总是数字([0] [1]等)

数组:

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

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

EXPECTED RESULT = array ( room, room, book , book , book, book )

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

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

EXPECTED RESULT = array ( room, room )

                [0] => Array
                    (
                        [0] => room
                    )

                [1] => Array
                    (
                        [0] => room


                    )

EXPECTED RESULT = array ( room )

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

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

EXPECTED RESULT = array ( room , room ,room , book )

所以它总是每个元素的最大计数,例如所有数组中的 book

非常感谢,

马雷克

【问题讨论】:

  • 您的数组表示法不太可读。能否包含数组的print_r() 输出,以便我们更轻松地查看数组的内容?
  • @AmalMurali,已编辑 :) 谢谢

标签: php arrays merge


【解决方案1】:

这里是:

function user_array_merge($arr) {
  if (func_num_args() == 1) return $arr;
  $vals = array_count_values($arr);
  $arrs = func_get_args();
  array_shift($arrs);
      foreach ($arrs as $arr2) {
        $vals2 = array_count_values($arr2);
        foreach ($vals2 as $val=>$count) {
           $vals[$val] = @max( $vals[$val], $count);
        }
      }
      $result = array();
      foreach ($vals as $val=>$count) {
         $result = array_pad($result, count($result)+$count, $val);
      }
      return $result;
    }

调用如下:

$res = user_array_merge(['room','room'], ['book', 'book','book','room'],['library']);

结果:

var_export($res);                                                                                    
array (
  0 => 'room',
  1 => 'room',
  2 => 'book',
  3 => 'book',
  4 => 'book',
  5 => 'library',
)

在大型阵列上应该会很慢。

【讨论】:

  • +1,这是我第一次看到使用array_pad 技巧的增量生成。未经测试,但它似乎是构建结果数组的最高效方式。不错!
【解决方案2】:

这将是在 O(n) 中执行此操作的合理方法:

function custom_array_merge() {
    // variable number of inputs
    $arrays = func_get_args();

    // consolidate into array of items => count/array(of counts) across inputs
    $counts = array_map('array_count_values', $arrays);
    $consolidated = call_user_func_array('array_merge_recursive', $counts);

    // reduce array of counts (where applicable) to maximum count
    $maximums = array_map(function($v) { 
        return is_array($v) ? max($v) : $v;
    }, $consolidated);

    // build result -- could be faster with array_fill() and concatenating 
    // but that would definitely use up more memory 
    $result = [];
    foreach ($maximums as $item => $times) {
        for ($i = 0; $i < $times; ++$i) {
            $result[] = $item;
        }
    }

    return $result;
}

See it in action.

【讨论】:

  • 我尝试使用它,但我收到了这个警告。警告:array_merge_recursive() 至少需要 1 个参数,0 给出在 $counts = array_map('array_count_values', $deti); $consolidated=call_user_func_array('array_merge_recursive',$counts);并且 $counts 打印正确
  • @user3411282:你怎么称呼它?在 ideone 上发布一个示例。
  • @user3411282:您的代码中似乎有错误。请发布您的确切代码,以便它运行并打印警告。
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2010-10-22
相关资源
最近更新 更多