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

时间:2011-07-16 14:57:12

标签: php

假设我有一个数组如下:

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

我想删除此数组中的所有重复项,因此结果应如下所示:

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

但这是抓住!!!我不想在array_unique()等构建函数中使用任何PHP。

你会怎么做? :)

6 个答案:

答案 0 :(得分:7)

这是一个简单的O(n)-time解决方案:

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

您不能拥有重复的密钥,这将保留订单。

答案 1 :(得分:2)

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)

编辑:与以下版本相同,但没有内置函数,只有语言结构(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等),所以这只是一个开始,也许它仍然是som使用:< / em>的

您可以将array_flip PHP Manualarray_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保留订单,因此您将获得结果。由于它们构建在函数中,因此速度非常快,并且没有太多迭代来完成工作。

答案 2 :(得分:2)

严肃(有效)的回答:

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

答案 3 :(得分:2)

这取决于您可用的操作。

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

  • 如果您的值有total order,则可以对数组进行排序(n*log(n)),然后消除连续的重复项(线性)。请注意,您无法使用PHP中的<>等运算符,它们不会引入总订单。不幸的是,array_unique执行此操作,因此可能会失败。

  • 如果您有一个可以应用于您的值的哈希函数,那么您可以使用哈希表(这是数组后面的数据结构)的平均线性时间来执行此操作。看到 坦杜的回答。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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