假设我有一个数组如下:
$sampArray = array (1,4,2,1,6,4,9,7,2,9)
我想删除此数组中的所有重复项,因此结果应如下所示:
$resultArray = array(1,4,2,6,9,7)
但这是抓住!!!我不想在array_unique()
等构建函数中使用任何PHP。
你会怎么做? :)
答案 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 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
保留订单,因此您将获得结果。由于它们构建在函数中,因此速度非常快,并且没有太多迭代来完成工作。
答案 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)
您可以使用中间数组依次添加每个项目。在添加项目之前,您可以通过循环遍历新数组来检查它是否已存在。