使用PHP从数组中删除重复项而不使用任何内置函数


Using PHP remove duplicates from an array without using any in- built functions?

假设我有一个数组,如下所示:

$sampArray = array (1,4,2,1,6,4,9,7,2,9)

我想从这个数组中删除所有的重复项,所以结果应该如下:

$resultArray = array(1,4,2,6,9,7)

但这里有个问题!!我不想在array_unique()这样的内置函数中使用任何PHP。

你会怎么做?:)

这是一个简单的O(n)时间解:

$uniqueme = array();
foreach ($array as $key => $value) {
   $uniqueme[$value] = $key;
}
$final = array();
foreach ($uniqueme as $key => $value) {
   $final[] = $key;
}

您不能有重复的键,这将保留顺序。

严肃的(有效的)回答:

$inputArray = array(1, 4, 2, 1, 6, 4, 9, 7, 2, 9);
$outputArray = array();
foreach($inputArray as $inputArrayItem) {
    foreach($outputArray as $outputArrayItem) {
        if($inputArrayItem == $outputArrayItem) {
            continue 2;
        }
    }
    $outputArray[] = $inputArrayItem;
}
print_r($outputArray);

这取决于您可用的操作。

  • 如果你要检测重复的是一个函数,它接受两个元素并告诉它们是否相等(一个例子是PHP中的==操作),那么你必须将每个新元素与你之前找到的所有非重复元素进行比较。解决方案将是二次的,在最坏的情况下(没有重复),你需要做(1/2)(n*(n+1))比较。如果你的数组可以有任何类型的值,这或多或少是唯一可用的解决方案(见下文)。

  • 如果您的值有一个总顺序,您可以对数组排序(n*log(n)),然后消除连续的重复(线性)。注意,您不能使用PHP中的<>等操作符,它们不引入总顺序。不幸的是,array_unique做到了这一点,并且可能因此而失败。

  • 如果你有一个可以应用于你的值的哈希函数,那么你可以在平均线性时间内使用哈希表(这是数组背后的数据结构)来完成它。看到tandu的答案。

Edit2:下面的版本使用哈希映射来确定值是否已经存在。如果这是不可能的,这里是另一个变体,安全地工作与所有PHP值,并进行严格的比较(Demo):

$array = array (1,4,2,1,6,4,9,7,2,9);
$unique = function($a)
{
    $u = array();    
    foreach($a as $v)
    {
        foreach($u as $vu)
            if ($vu===$v) continue 2
        ;
        $u[] = $v;
    }
    return $u;
};
var_dump($unique($array)); # array(1,4,2,6,9,7)

Edit:与下面的版本相同,但是没有内置函数,只有语言结构(Demo):

$array = array (1,4,2,1,6,4,9,7,2,9);
$unique = array();
foreach($array as $v)
  isset($k[$v]) || ($k[$v]=1) && $unique[] = $v; 
var_dump($unique); # array(1,4,2,6,9,7)

如果你不想让临时数组到处分布,这里有一个匿名函数的变体:

$array = array (1,4,2,1,6,4,9,7,2,9);
$unique = function($a) /* similar as above but more expressive ...                   ... you have been warned: */ {for($v=reset($a);$v&&(isset($k[$v])||($k[$v]=1)&&$u[]=$v);$v=next($a));return$u;};
var_dump($unique($array)); # array(1,4,2,6,9,7)

首先是你不想使用array_unique或类似的函数(array_intersect等),所以这只是一个开始,也许它仍然有些用处:

你可以使用array_flip PHP Manual结合array_keys PHP Manual为你的整数数组(Demo):

$array = array (1,4,2,1,6,4,9,7,2,9);
$array = array_keys(array_flip($array));
var_dump($array); # array(1,4,2,6,9,7)

由于键在PHP数组中只能存在一次,并且array_flip保留顺序,因此您将得到您的结果。因为这些都是内置函数,所以它非常快,并且没有太多的迭代来完成工作。

<?php
$inputArray = array(1, 4, 2, 1, 6, 4, 9, 7, 2, 9);
$outputArray = array();
foreach ($inputArray as $val){
 if(!in_array($val,$outputArray)){
  $outputArray[] = $val;
 }
}
print_r($outputArray);

您可以使用一个中间数组,依次向其中添加每一项。在添加项目之前,您可以通过循环遍历新数组来检查它是否已经存在。