array_unique

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_unique移除数组中的重复值

描述

array_unique(array $array, int $flags = SORT_STRING): array

接受一个输入 array 并返回一个没有重复值的数组。

注意键是保留的。如果多个元素在给定的 flags 下比较相等,则将保留第一个相等元素的键和值。

注意: 两个元素被认为相等当且仅当 (string) $elem1 === (string) $elem2,即当字符串表示形式相同时,将使用第一个元素。

参数

array

输入数组。

flags

可选的第二个参数 flags 可用于使用以下值修改比较行为

比较类型标志

返回值

返回过滤后的数组。

变更日志

版本 描述
7.2.0 如果 flagsSORT_STRING,以前 array 已被复制并且非唯一元素已被移除(在之后没有打包数组),但现在通过添加唯一元素构建了一个新数组。这可能会导致不同的数字索引。

范例

范例 #1 array_unique() 范例

<?php
$input
= array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>

上面的例子将输出

Array
(
    [a] => green
    [0] => red
    [1] => blue
)

范例 #2 array_unique() 和类型

<?php
$input
= array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
?>

上面的例子将输出

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

注释

注意: 请注意,array_unique() 不适用于多维数组。

参见

添加注释

用户贡献的注释 33 条注释

319
Ghanshyam Katriya(anshkatriya at gmail)
9 年前
为任何单个键索引创建多维数组唯一值。
例如,我想为特定代码创建多维唯一数组

代码
我的数组是这样的:

<?php
$details
= array(
0 => array("id"=>"1", "name"=>"Mike", "num"=>"9876543210"),
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
2 => array("id"=>"1", "name"=>"Mathew", "num"=>"784581254"),
);
?>

您可以针对任何字段(如 id、name 或 num)使它唯一。

我已经为此开发了这个函数
<?php
function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();

foreach(
$array as $val) {
if (!
in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
return
$temp_array;
}
?>

现在,从您的代码中的任何位置调用此函数:

例如:
<?php
$details
= unique_multidim_array($details,'id');
?>

输出将是这样的
<?php
$details
= array(
0 => array("id"=>"1","name"=>"Mike","num"=>"9876543210"),
1 => array("id"=>"2","name"=>"Carissa","num"=>"08548596258"),
);
?>
30
Mike D. - michal at euro-net.pl
1 年前
修改了 Ghanshyam Katriya(anshkatriya at gmail) 发表的原始代码 [此处投票数最高的评论]。

1. 在 php 7.4 中,计数器 $i 会破坏函数。已完全删除(我认为反正浪费了按键次数)。
2. 我添加了第二个返回值 - 重复值的数组。因此,您可以将两者都取出来进行比较(我必须这样做)。

示例数组(从原始帖子复制粘贴)
<?php
$details
= array(
0 => array("id"=>"1", "name"=>"Mike", "num"=>"9876543210"),
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
2 => array("id"=>"1", "name"=>"Mathew", "num"=>"784581254"),
);
?>

函数
<?php
function unique_multidim_array($array, $key) : array {
$uniq_array = array();
$dup_array = array();
$key_array = array();

foreach(
$array as $val) {
if (!
in_array($val[$key], $key_array)) {
$key_array[] = $val[$key];
$uniq_array[] = $val;
/*
# 第一个列表检查:
# echo "ID or sth: " . $val['building_id'] . "; Something else: " . $val['nodes_name'] . (...) "\n";
*/
} else {
$dup_array[] = $val;
/*
# 第二个列表检查:
# echo "ID or sth: " . $val['building_id'] . "; Something else: " . $val['nodes_name'] . (...) "\n";
*/
}
}
return array(
$uniq_array, $dup_array, /* $key_array */);
}
?>

使用方法
<?php
list($unique_addresses, $duplicates, /* $unique_keys */) = unique_multidim_array($details,'id');
?>

然后
var_dump($unique_addresses);
或者
var_dump($duplicates);
或者使用 foreach 循环或其他方法。我个人只是在函数本身中回显了第一个和第二个列表(两个都双重注释),然后将它们复制到 Notepad++ 中进行比较,以确保万无一失,但如果你想用它们做其他事情,就尽情享受吧 :)
另外,作为额外奖励,你还可以获得一个你搜索的唯一键的数组(只需在函数返回值和函数调用代码中取消注释 >$key_array<)。

从示例数组代码中返回
var_dump($unique_addresses);
array(2) {
[0]=>
array(3) {
["id"]=>
string(1) "1"
["name"]=>
string(4) "Mike"
["num"]=>
string(10) "9876543210"
}
[1]=>
array(3) {
["id"]=>
string(1) "2"
["name"]=>
string(7) "Carissa"
["num"]=>
string(11) "08548596258"
}
}

var_dump($duplicates);
array(1) {
[0]=>
array(3) {
["id"]=>
string(1) "1"
["name"]=>
string(6) "Mathew"
["num"]=>
string(9) "784581254"
}
}

以及键(如果你需要)。

附注:在我的实际数据库查询案例中,我得到了大约 4000 个唯一项和 15000 个重复项 :)
22
falundir at gmail dot com
6 年前
我发现这个函数没有版本允许你使用比较器可调用函数来确定项目的相等性(比如 array_udiff 和 array_uintersect)很奇怪。所以,这是我的版本,供你参考。

<?php
function array_uunique(array $array, callable $comparator): array {
$unique_array = [];
do {
$element = array_shift($array);
$unique_array[] = $element;

$array = array_udiff(
$array,
[
$element],
$comparator
);
} while (
count($array) > 0);

return
$unique_array;
}
?>

这是一段测试代码

<?php
class Foo {

public
$a;

public function
__construct(int $a) {
$this->a = $a;
}
}

$array_of_objects = [new Foo(2), new Foo(1), new Foo(3), new Foo(2), new Foo(2), new Foo(1)];

$comparator = function (Foo $foo1, Foo $foo2): int {
return
$foo1->a <=> $foo2->a;
};

var_dump(array_uunique($array_of_objects, $comparator)); // 应该输出 [Foo(2), Foo(1), Foo(3)]
?>
96
Anonymous
14 年前
使用 foreach 循环和 array_keys 通常比使用 array_unique 速度更快。

<?php

$max
= 1000000;
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);
echo
"去重后为 ".count($res1).",耗时 ".$time;
// 去重后为 666667,耗时 32.300781965256

$time = -microtime(true);
$res2 = array();
foreach(
$arr as $key=>$val) {
$res2[$val] = true;
}
$res2 = array_keys($res2);
$time += microtime(true);
echo
"<br />去重后为 ".count($res2).",耗时 ".$time;
// 去重后为 666667,耗时 0.84372591972351

?>
18
stoff@
7 年前
关于 array_unique 和 foreach 性能测试的回复。

在 PHP7 中,对打包数组和不可变数组进行了重大更改,导致性能差异大幅下降。以下是 php7.1 中的相同测试结果;
http://sandbox.onlinephpfunctions.com/code/2a9e986690ef8505490489581c1c0e70f20d26d1

$max = 770000; // 在内存分配范围内足够大的数字
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);
echo "去重后为 ".count($res1).",耗时 ".$time;
// 去重后为 513333,耗时 1.0876770019531

$time = -microtime(true);
$res2 = array();
foreach($arr as $key=>$val) {
$res2[$val] = true;
}
$res2 = array_keys($res2);
$time += microtime(true);
echo "<br />去重后为 ".count($res2).",耗时 ".$time;
// 去重后为 513333,耗时 0.054931879043579
3
calexandrepcjr at gmail dot com
7 年前
遵循 Ghanshyam Katriya 的想法,但使用的是对象数组,其中 $key 与你想要过滤唯一性的对象属性相关。

<?php
函数 obj_multi_unique($obj, $key = false)
{
$totalObjs = count($obj);
if (
is_array($obj) && $totalObjs > 0 && is_object($obj[0]) && ($key && !is_numeric($key))) {
for (
$i = 0; $i < $totalObjs; $i++) {
if (isset(
$obj[$i])) {
for (
$j = $i + 1; $j < $totalObjs; $j++) {
if (isset(
$obj[$j]) && $obj[$i]->{$key} === $obj[$j]->{$key}) {
unset(
$obj[$j]);
}
}
}
}
return
array_values($obj);
} else {
throw new
Exception('无效参数或您的对象数组为空');
}
}
?>
3
Dorphalsig
16 年前
我在使用 `array_unique` 处理多维数组时遇到了问题...也许有更好的方法,但这个方法对任何维度的数组都适用。

<?php
函数 arrayUnique($myArray)
{
if(!
is_array($myArray))
return
$myArray;

foreach (
$myArray as &$myvalue){
$myvalue=serialize($myvalue);
}

$myArray=array_unique($myArray);

foreach (
$myArray as &$myvalue){
$myvalue=unserialize($myvalue);
}

return
$myArray;

}
?>
26
Ray dot Paseur at SometimesUsesGmail dot com
16 年前
我需要在一个数据表中识别重复的电子邮件地址,所以我写了 `array_not_unique()` 函数。

<?php

函数 array_not_unique($raw_array) {
$dupes = array();
natcasesort($raw_array);
reset ($raw_array);

$old_key = NULL;
$old_value = NULL;
foreach (
$raw_array as $key => $value) {
if (
$value === NULL) { continue; }
if (
$old_value == $value) {
$dupes[$old_key] = $old_value;
$dupes[$key] = $value;
}
$old_value = $value;
$old_key = $key;
}
return
$dupes;
}

$raw_array = array();
$raw_array[1] = '[email protected]';
$raw_array[2] = '[email protected]';
$raw_array[3] = '[email protected]';
$raw_array[4] = '[email protected]'; // 重复

$common_stuff = array_not_unique($raw_array);
var_dump($common_stuff);
?>
2
free dot smilesrg at gmail dot com
1 年前
$a = new StdClass();
$b = new StdClass();

var_dump(array_unique([$a, $b, $b, $a], SORT_REGULAR));
//array(1) {
// [0]=>
// object(stdClass)#1 (0) {
// }
//}

$a->name = 'One';
$b->name = 'Two';

var_dump(array_unique([$a, $b, $b, $a], SORT_REGULAR));

//array(2) {
// [0]=>
// object(stdClass)#1 (1) {
// ["name"]=>
// string(3) "One"
// }
// [1]=>
// object(stdClass)#2 (1) {
// ["name"]=>
// string(3) "Two"
// }
//}
2
contact at evoweb dot fr
3 年前
以下是一个解决方案,用于保持包含键的数组中唯一值,并保留空值。

<?php
函数 array_unique_kempty($array) {
$values = array_unique($array);
$return = array_combine(array_keys($array), array_fill(0,count($array),null));
return
array_merge($return,$values);
}

$myArray = [
"test1" => "aaa",
"test2" => null,
"test3" => "aaa",
"test4" => "bbb",
"test5" => null,
"test6" => "ccc",
"test7" => "ddd",
"test8" => "ccc"
];

echo
"<pre>".print_r(array_unique_kempty($myArray),true)."</pre>";

/*
Array
(
[test1] => aaa
[test2] =>
[test3] =>
[test4] => bbb
[test5] =>
[test6] => ccc
[test7] => ddd
[test8] =>
)
*/
?>
36
mnbayazit
16 年前
不区分大小写;将保留第一次遇到的值。

<?php

函数 array_iunique($array) {
$lowered = array_map('strtolower', $array);
return
array_intersect_key($array, array_unique($lowered));
}

?>
2
PHP Expert
16 年前
PHP v4.x 及以上版本的不区分大小写。

<?php

函数 in_iarray($str, $a) {
foreach (
$a as $v) {
if (
strcasecmp($str, $v) == 0) {
return
true;
}
}
return
false;
}

函数
array_iunique($a) {
$n = array();
foreach (
$a as $k => $v) {
if (!
in_iarray($v, $n)) {
$n[$k]=$v;
}
}
return
$n;
}

$input = array("aAa","bBb","cCc","AaA","ccC","ccc","CCC","bBB","AAA","XXX");
$result = array_iunique($input);
print_r($result);

/*
Array
(
[0] => aAa
[1] => bBb
[2] => cCc
[9] => XXX
)
*/
?>
6
sashasimkin at gmail dot com
12 年前
我的对象唯一性函数

<?php
function object_unique( $obj ){
$objArray = (array) $obj;

$objArray = array_intersect_assoc( array_unique( $objArray ), $objArray );

foreach(
$obj as $n => $f ) {
if( !
array_key_exists( $n, $objArray ) ) unset( $obj->$n );
}

return
$obj;
}
?>

以下是代码

<?php
class Test{
public
$pr0 = 'string';
public
$pr1 = 'string1';
public
$pr2 = 'string';
public
$pr3 = 'string2';
}

$obj = new Test;

var_dump( object_unique( $obj ) );
?>

返回值
object(Test)[1]
public 'pr0' => string 'string' (length=6)
public 'pr1' => string 'string1' (length=7)
public 'pr3' => string 'string2' (length=7)
16
mostafatalebi at rocketmail dot com
10年前
如果你需要获得一个排序后的数组,并且不保留键,可以使用这段代码,这段代码对我很有效

<?php

$array
= array("hello", "fine", "good", "fine", "hello", "bye");

$get_sorted_unique_array = array_values(array_unique($array));

?>

上述代码返回一个数组,该数组既是唯一的,又是从零开始排序的。
22
regeda at inbox dot ru
14 年前
多维数组的递归数组唯一

<?php
function super_unique($array)
{
$result = array_map("unserialize", array_unique(array_map("serialize", $array)));

foreach (
$result as $key => $value)
{
if (
is_array($value) )
{
$result[$key] = super_unique($value);
}
}

return
$result;
}
?>
7
agarcia at rsn dot com dot co
18年前
这是一个用于多维数组的脚本

<?php
function remove_dup($matriz) {
$aux_ini=array();
$entrega=array();
for(
$n=0;$n<count($matriz);$n++)
{
$aux_ini[]=serialize($matriz[$n]);
}
$mat=array_unique($aux_ini);
for(
$n=0;$n<count($matriz);$n++)
{

$entrega[]=unserialize($mat[$n]);

}
return
$entrega;
}
?>
4
keneks at gmail dot com
17年前
利用array_unique的优势,这里有一个简单的函数来检查数组是否包含重复值。

它只是比较原始数组和array_uniqued数组的元素数量。

<?php

function array_has_duplicates(array $array)
{
$uniq = array_unique($array);
return
count($uniq) != count($array);
}

?>
6
quecoder at gmail
15年前
另一种获取唯一值的方法是

<?php
$alpha
=array('a','b','c','a','b','d','e','f','f');

$alpha= array_keys(array_count_values($alpha));

print_r($alpha);
?>

输出
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )
3
jusvalceanu - SPAM at SPAM - yahoo dot com
15年前
所以……我的问题是多维排序。

<?php
$new
= array();
$exclude = array("");
for (
$i = 0; $i<=count($attribs)-1; $i++) {
if (!
in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }
}

?>

数组 $attribs 是一个包含数组的数组。$attrib 数组中的每个数组都包含多个字段(例如:name、length、price 等)。为了更简单地说明,你可以认为 $attrib 是通过访问者在你的在线购物网站上进行的搜索 SQL 查询所产生的数组……(所以……$attrib 中的每个数组都是一个产品:P)如果你想只对唯一的结果进行排序,可以使用上述代码,或者使用这段代码

<?php

/* Our Array of products */
$attribs[] = array(
"name" => "Test Product 1",
"length" => "42 cm",
"weight" => "0,5 kg",
"price" => "10 $",
"stock" => "100",
);

$attribs[] = array(
"name" => "Test Product 2",
"length" => "42 cm",
"weight" => "1,5 kg",
"price" => "10 $",
"stock" => "200",
);

/* The nice stuff */

$new = array();
$exclude = array("");
for (
$i = 0; $i<=count($attribs)-1; $i++) {
if (!
in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }
}

print_r($new); // $new is our sorted array

?>

随意调整它吧:))我知道你会的:))

来自罗马尼亚的爱
4
webmaster at jukkis dot net
17年前
另一种对数组进行“唯一列”操作的方法,在本例中是对象数组
将所需的唯一列值保存在 array_filter 回调函数中的静态数组中。

示例
<?php
/* 示例对象 */
class myObj {
public
$id;
public
$value;
function
__construct( $id, $value ) {
$this->id = $id;
$this->value = $value;
}
}

/* 回调函数 */
function uniquecol( $obj ) {
static
$idlist = array();

if (
in_array( $obj->id, $idlist ) )
return
false;

$idlist[] = $obj->id;
return
true;
}

/* 两个数组,第二个数组中有一个元素的 id 与第一个数组中相同 */
$list = array( new myObj( 1, 1 ), new myObj( 2, 100 ) );
$list2 = array( new myObj( 1, 10 ), new myObj( 3, 100 ) );
$list3 = array_merge( $list, $list2 );

$unique = array_filter( $list3, 'uniquecol' );
print_r( $list3 );
print_r( $unique );

?>

此外,使用 array_merge( $unique ) 重新索引。
3
subhrajyoti dot de007 at gmail dot com
6 年前
从多维数组中删除重复项的简单干净的方法。

<?php
$multi_array
= $multi_array [0];
$multi_array = array_unique($multi_array);
print_r($multi_array);
?>
3
Fabiano
6 年前
对于 PHP 7.1.12,这是 array_keys(array_flip())、array_flip(array_flip())、逐个消除和 array_unique 之间的比较。array_keys(array_flip()) 是从单维数组中删除重复值的最快方法。

<?php

$max
= 1000000;
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);

echo
"<br>deduped to ".count($res1)." in ".$time;
// deduped to 666667 in 0.78185796737671
// memory used: 33558528

$time = -microtime(true);
$res2 = array_flip(array_flip($arr));
$time += microtime(true);

echo
"<br><br>deduped to ".count($res2)." in ".$time;
// deduped to 666667 in 0.072191953659058
// memory used: 3774873

$time = -microtime(true);
$res3 = array();
foreach(
$arr as $key=>$val) {
$res3[$val] = true;
}
$res3 = array_keys($res3);
$time += microtime(true);

echo
"<br /><br>deduped to ".count($res3)." in ".$time;
// deduped to 666667 in 0.095494985580444
// memory used: 33558528

$time = -microtime(true);
$res4 = array_keys(array_flip($arr));
$time += microtime(true);

echo
"<br /><br>deduped to ".count($res4)." in ".$time;
// deduped to 666667 in 0.05807900428772
// memory used: 33558528
2
zoolyka at gmail dot com
8 年前
我发现了一种使多维数组“唯一”的最简单方法,如下所示

<?php

$array
= array(
'a' => array(1, 2),
'b' => array(1, 2),
'c' => array(2, 2),
'd' => array(2, 1),
'e' => array(1, 1),
);

$array = array_map('json_encode', $array);
$array = array_unique($array);
$array = array_map('json_decode', $array);

print_r($array);

?>

正如您所见,“b”将被删除,没有任何错误或通知。
1
dirk dot avery a t gmail
15年前
虽然 array_unique 不打算用于多维数组,但它在 5.2.9 上有效。但是,它在 5.2.5 上无效。注意。
1
geuis dot teses at gmail dot com
17年前
这是我能找到/创建的最短代码行,用于从数组中删除所有重复项,然后重新索引键。

<?php

// 水果、蔬菜和其他食物:
$var = array('apple','banana','carrot','cat','dog','egg','eggplant','fish');

$var = array_values(array_unique($var));
?>
2
amri [ at t] dhstudio dot eu
14 年前
我搜索了如何仅显示数组中的去重元素,但失败了。
这是我的解决方案

<?php
function arrayUniqueElements($array)
{
return
array_unique(array_diff_assoc($array1,array_unique($array1)));
};
?>

示例
<?php
$arr1
= array('foo', 'bar', 'xyzzy', '&', 'xyzzy',
'baz', 'bat', '|', 'xyzzy', 'plugh',
'xyzzy', 'foobar', '|', 'plonk', 'xyzzy',
'apples', '&', 'xyzzy', 'oranges', 'xyzzy',
'pears','foobar');

$result=arrayUniqueElements($arr1);
print_r($result);exit;
?>

输出

数组
(
[4] => xyzzy
[12] => |
[16] => &
[21] => foobar
)
1
memandeemail at gmail dot com
18年前
问题
我已经使用数据库查询结果加载了一个数组。
字段是 'FirstName' 和 'LastName'。

我想找到一种方法来连接这两个
字段,然后只返回数组的唯一值。
例如,如果数据库查询返回
三个包含 FirstName John 的记录实例
和 LastName Smith 在两个不同的字段中,我想要
创建一个包含所有
原始字段的新数组,但其中只包含 John Smith 一次。
感谢:Colin Campbell

解决方案

<?php
/**
* 与 implode 函数相同,但返回键,所以
*
* <code>
* $_GET = array('id' => '4587','with' => 'key');
* ...
* echo shared::implode_with_key('&',$_GET,'='); // Resultado: id=4587&with=key
* ...
* </code>
*
* @param string $glue 键值对之间放置的内容
* @param array $pieces 值
* @param string $hifen 分隔数组键和值
* @return string
* @author memandeemail at gmail dot com
*/
function implode_with_key($glue = null, $pieces, $hifen = ',') {
$return = null;
foreach (
$pieces as $tk => $tv) $return .= $glue.$tk.$hifen.$tv;
return
substr($return,1);
}

/**
* 从值树中返回唯一值
*
* @param array $array_tree
* @return array
* @author memandeemail at gmail dot com
*/
function array_unique_tree($array_tree) {
$will_return = array(); $vtemp = array();
foreach (
$array_tree as $tkey => $tvalue) $vtemp[$tkey] = implode_with_key('&',$tvalue,'=');
foreach (
array_keys(array_unique($vtemp)) as $tvalue) $will_return[$tvalue] = $array_tree[$tvalue];
return
$will_return;
}

$problem = array_fill(0,3,
array(
'FirstName' => 'John', 'LastName' => 'Smith')
);

$problem[] = array('FirstName' => 'Davi', 'LastName' => 'S. Mesquita');
$problem[] = array('FirstName' => 'John', 'LastName' => 'Tom');

print_r($problem);

print_r(array_unique_tree($problem));
?>
2
tasiot
1 年前
array_unique 与 php 8.1 枚举不兼容,因为枚举还没有字符串表示(即使是字符串类型的 BackedEnum 也是如此)。
你会收到一个错误:“无法将类 XXXX 的对象转换为字符串。”

所以我写了这个函数,它创建了枚举的字符串表示,并使用数组键来删除重复项

<?php

function array_unique_81(array $values): array
{
$unique = [];
foreach (
$values as $value) {
if (
$value instanceof \UnitEnum) {
$key = 'e:' . \get_class($value) . ':' . $value->name;
} else {
$key = 's:' . (string)$value;
}
$unique[$key] = $value;
}
return
\array_values($unique);
}

?>
2
Sbastien
2 年前
由于 PHP 比较方式的原因,你永远无法区分 null 和其他假值。
注意真假布尔值在混合类型数组中的吸收性。

<?php

$a
= [true, false, null, '', '0', '123', 0, 123];
foreach ([
'SORT_REGULAR', 'SORT_NUMERIC', 'SORT_STRING', 'SORT_LOCALE_STRING'] as $flag) {
$a_new = array_unique($a, constant($flag));
echo
"{$flag} ==> ";
var_dump($a_new);
}

/*

Gives :

SORT_REGULAR ==> array(2) {
[0]=> bool(true)
[1]=> bool(false)
}
SORT_NUMERIC ==> array(3) {
[0]=> bool(true)
[1]=> bool(false)
[5]=> string(3) "123"
}
SORT_STRING ==> array(4) {
[0]=> bool(true)
[1]=> bool(false)
[4]=> string(1) "0"
[5]=> string(3) "123"
}
SORT_LOCALE_STRING ==> array(4) {
[0]=> bool(true)
[1]=> bool(false)
[4]=> string(1) "0"
[5]=> string(3) "123"
}

*/
-1
tasiot
6 个月前
另一个基于键删除多维数组中重复项的解决方案...

<?php

function array_unique_multi(array $array, string $key): array
{
$unique = [];
foreach (
$array as $v) {
if (!
array_key_exists($v[$key], $unique)) {
$unique[$v[$key]] = $v;
}
}
return
array_values($unique);
}

// Usage
$unique = array_unique_multi($users, 'id');

?>

或者保留键...

<?php

function array_unique_amulti(array $array, string $key): array
{
$keys = [];
$unique = [];
foreach (
$array as $k => $v) {
if (!isset(
$keys[$v[$key]])) {
$keys[$v[$key]] = true;
$unique[$k] = $v;
}
}
return
$unique;
}

?>
0
Victoire Nkolo at crinastudio.com
1 年前
<?php

// 根据给定属性从数组中移除重复的对象

class ArrayFilter
{

public static function
dedupe_array_of_objets(array $array, string $property) : array
{
$i = 0;
$filteredArray = array();
$keyArray = array();

foreach(
$array as $item) {
if (!
in_array($item->$property, $keyArray)) {
$keyArray[$i] = $item->$property;
$filteredArray[$i] = $item;
}
$i++;
}
return
$filteredArray;
}
}
0
Ludovico Grossi
9 年前
[编辑注:请注意,这对于数组中的非标量值效果不佳。数组键本身不能是数组,也不能是流、资源等。翻转数组会导致键名的改变。]

您可以在 PHP 中直接执行 array_unique 的超快速版本,甚至比评论中发布的其他解决方案更快!

与内置函数相比,它快 20 倍!(比评论中的解决方案快 2 倍)。

<?php
function superfast_array_unique($array) {
return
array_keys(array_flip($array));
}
?>

这对于大小数组都有效。
0
csaba at alum dot mit dot edu
20 年前
以下是 array_unique 的高效、可适应实现,它始终保留具有给定值的第一个键

<?php
function array_unique2(&$aray) {
$aHash = array();
foreach (
$aray as $key => &$val) if (@$aHash[$val]++) unset ($aray[$key]);
}
?>

它也可以适应多维数组。例如,如果您的数组是一系列(多维)点,那么您可以使用 @$aHash[implode("X",$val)]++ 代替 @$aHash[$val]++。
如果您不想在数组中留有空洞,可以在最后执行 array_merge($aray)。

Csaba Gabor
To Top