【问题标题】:array_merge & array_uniquearray_merge & array_unique
【发布时间】:2011-06-07 08:04:10
【问题描述】:

PHP 中是否有一个数组函数以某种方式执行 array_merge,比较 ,忽略键?我认为array_unique(array_merge($a, $b)) 有效,但我相信一定有更好的方法来做到这一点。

例如。

$a = array(0 => 0, 1 => 1, 2 => 2);
$b = array(0 => 2, 1 => 3, 2 => 4);

导致:

$ab = array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4);

请注意,我不关心 $ab 中的键,但是如果它们从 0 到 count($ab)-1 递增,会很好

【问题讨论】:

  • 我认为没有更好的方法可以做到这一点。 array_unique(array_merge($a, $b)) 实际上是一个非常优雅的解决方案。
  • 需要注意的是,只有当键是数字或保证在两个数组之间唯一时,这才有效,否则array_merge 将覆盖。

标签: php arrays array-merge array-unique


【解决方案1】:

最优雅,最简单,最有效的解决方案是原问题中提到的那个......

$ab = array_unique(array_merge($a, $b));

Ben Lee 和 doublejosh 之前在 cmets 中也提到了此答案,但我将其作为实际答案发布在这里,以帮助其他发现此问题并想知道最佳解决方案而不阅读所有内容的人此页面上的 cmets。

【讨论】:

  • 优雅而简单,是的,但最终才是最高效的。在数组足够大之前,复制和排序数组不会变得高效。
【解决方案2】:
function umerge($arrays){
 $result = array();
 foreach($arrays as $array){
  $array = (array) $array;
  foreach($array as $value){
   if(array_search($value,$result)===false)$result[]=$value;
  }
 }
 return $result;
}

【讨论】:

  • 我会选择这个作为正确答案,因为这是一个很好的方法。但是,您在第 5 行写了“reult”而不是 result。另一种方式:array_merge(array_unique(array_merge($a, $b)));谢谢大家。
  • @doublejosh 在数组变得相当大(约 400 个元素)之前,这将更有效率。
  • @doublejosh 必须处理 10.000 多个项目数组和运行 9:50 的脚本,最大执行时间为 10:00。那是在 2011 年,我很高兴我不再需要处理这类问题(新工作/更好的服务器)。
  • 天啊。需要直接在 PHP 中处理的大量数据!
【解决方案3】:

为了回答所提出的问题,对于在保留键的同时也适用于关联数组的通用解决方案,我相信您会发现此解决方案最令人满意:

/**
 * array_merge_unique - return an array of unique values,
 * composed of merging one or more argument array(s).
 *
 * As with array_merge, later keys overwrite earlier keys.
 * Unlike array_merge, however, this rule applies equally to
 * numeric keys, but does not necessarily preserve the original
 * numeric keys.
 */
function array_merge_unique(array $array1 /* [, array $...] */) {
  $result = array_flip(array_flip($array1));
  foreach (array_slice(func_get_args(),1) as $arg) { 
    $result = 
      array_flip(
        array_flip(
          array_merge($result,$arg)));
  } 
  return $result;
}

【讨论】:

    【解决方案4】:

    array_merge 将忽略数字键,因此在您的示例中,array_merge($a, $b) 将给您$ab,无需调用array_unique()

    如果您有字符串键(即关联数组),请先使用array_values()

    array_merge(array_values($a), array_values($b));
    

    【讨论】:

    • 他想要唯一的值,所以他需要打电话给array_unique
    • 它到底在哪里说他只想要独特的价值?仅仅因为他使用了array_unique 并没有任何意义——他坦率地承认他不确定该使用什么,并且描述中没有提到只需要唯一的条目。
    • @Will,你是对的,值必须是唯一的 @Stephen:抱歉,这可能令人困惑。解决方案是:array_merge(array_unique(array_merge($a, $b)));因为第二个 array_merge 将键从 0 排序到 4!谢谢大家!
    • 在这种情况下,您不需要两个 array_merge 调用 - 一个 array_values 调用可能是更好的选择
    • 原始问题的示例确实表明他正在寻找唯一值。在调用 array_merge() 之前调用 array_values() 实际上根本不会做任何事情,因为 array_merge() 将重新编号数组键,因为输入数组具有数字键(请参阅 array_merge() PHP 文档)。
    【解决方案5】:
    $a = array(0 => 0, 1 => 1, 2 => 2);
    $b = array(0 => 2, 1 => 3, 2 => 4);
    
    //add any from b to a that do not exist in a
    foreach($b as $item){
    
    
        if(!in_array($item,$b)){
            $a[] = $item
        }
    
    }
    
    //sort the array
    sort($a);
    

    【讨论】:

      猜你喜欢
      • 2013-03-19
      • 2023-03-27
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      相关资源
      最近更新 更多