导航:首页 > 编程语言 > php数组删除重复元素

php数组删除重复元素

发布时间:2025-09-09 22:40:34

❶ uniqueidphp下判断数组中是否存在相同的值array_unique

array_unique() 函数在PHP中用于去除数组中的重复值,确保返回的新数组中不包含任何重复的元素。此函数保留数组中元素的键名不变,但在内部对值进行排序,仅保留首次遇到的键名。如果数组中的两个元素在字符串比较下相同,那么第一个元素将被保留。

考虑以下实例:如果数组包含 "a" => "green", "red", "b" => "green", "blue", "red",执行array_unique() 后,输出为:Array([a] =>green[0] =>red[1] =>blue)。注意,"red" 的键名被忽略,"green" 的键名 "b" 也被忽略,因为它们与已存在的键名相同。

下面的代码展示了如何使用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)

在另一个例子中,使用整数和字符串,如数组(4, "4", "3", 4, 3, "3"),执行array_unique() 后,输出为:array(2) {[0] =>int(4)[2] =>string(1) "3"}。这表明4和"4"被视为相同元素,只保留了第一次出现的值。

php
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_mp($result);

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

通过以上示例,我们可以看出array_unique() 在去除数组中重复值时的使用方法及功能。该函数在处理集合数据时非常有用,特别是在需要确保数组元素唯一性的情况下。

❷ PHP7源码之array_unique函数分析

以下源码基于 PHP 7.3.8

array array_unique ( array array[,intarray[,intsort_flags = SORT_STRING ] ) (PHP 4 >= 4.0.1, PHP 5, PHP 7) array_unique — 移除数组中重复的值 参数说明: array:输入的数组。 sort_flag:(可选)排序类型标记,用于修改排序行为,主要有以下值: SORT_REGULAR - 按照通常方法比较(不修改类型) SORT_NUMERIC - 按照数字形式比较 SORT_STRING - 按照字符串形式比较 SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。

array_unique 函数的源代码在 /ext/standard/array.c 文件中。由于篇幅过长,完整代码不在这里贴出来了,可以参见 GitHub 贴出的源代码。

定义变量

首先是定义变量,array_unique 函数默认使用 PHP_SORT_STRING 排序,PHP_SORT_STRING 在 /ext/standard/php_array.h 头文件中定义。

可以看到和开头PHP函数的sort_flag 参数默认的预定义常量 SORT_STRING 很像。

compare_func_t cmp 这行代码没看懂,不清楚是做什么的。compare_func_t 在 /Zend/zend_types.h 中定义:应该是定义了一个指向int 型返回值且带有两个指针常量参数的函数指针类型,没有查到相关资料,先搁着,继续往下看。

参数解析

ZEND_PARSE_PARAMETERS_START(1, 2),第一个参数表示必传参数个数,第二个参数表示最多参数个数,即该函数参数范围是 1-2 个。

数组元素个数判断

这段代码很容易看懂,当数组为空或只有 1 个元素时,无需去重操作,直接将array 拷贝到新数组 return_value来返回即可。

分配持久化内存

这一步只有当sort_type 为 PHP_SORT_STRING 时才执行。在下面可以看到调用 zend_hash_init 初始化了 array,调用 zend_hash_destroy 释放持久化的内存。

设置比较函数

进行具体比较顺序控制的函数指针是cmp,是通过向 php_get_data_compare_func 传入 sort_type 和 0 得到的,sort_type 也就是 SORT_STRING 这样的标记。

php_get_data_compare_func 在 array.c 文件中定义(即与 array_unique 函数同一文件),代码过长,这里只贴出默认标记为 SORT_STRING 的代码:

在前面的代码中,我们可以看到,cmp = php_get_data_compare_func(sort_type, 0); 的第二个参数,即参数 reverse 的值为 0,也就是当 sort_type 为 PHP_SORT_STRING 时,调用的是 php_array_data_compare_string 函数,即 SORT_STRING 采用 php_array_data_compare_string 进行比较。继续展开 php_array_data_compare_string 函数:

可以得到这样一条调用链:

string_compare_function 是一个 ZEND API,在 /Zend/zend_operators.c 中定义:

可以看到,SORT_STRING 使用 zend_binary_strcmp 函数进行字符串比较。下面的代码是 zend_binary_strcmp 的实现(也在 /Zend/zend_operators.c 中):

上面的代码是比较两个字符串。也就是SORT_STRING 排序方式的底层实现是 C 语言的 memcmp,即它对两个字符串从前往后,按照逐个字节比较,一旦字节有差异,就终止并比较出大小。

数组排序

这段代码初始化一个新的数组,然后将值拷贝到新数组,然后调用zend_sort 排序函数对数组进行排序。排序算法在 /Zend/zend_sort.c 中实现,注释有这样一句话:

Derived from LLVM's libc++ implementation of std::sort.

这个排序算法是基于LLVM 的 libc++ 中的 std::sort 实现的,算是快排的优化版,当元素数小于等于16时有特殊的优化,当元素数小于等于 5 时直接通过 if else 嵌套判断排序。代码就不贴出来了。

数组去重

回到array_unique 上,继续看代码:

遍历排序好的数组,然后删除重复的元素。

众周所知,快排的时间复杂度是O(nlogn),因此,array_unique 函数的时间复杂度是O(nlogn)。array_unique 底层调用了快排算法,加大了函数运行的时间开销,当数据量很大时,会导致整个函数的运行较慢。

❸ php怎么移除数组中的某个值

php移除数组中的某个值的方法:1、利用foreach和unset函数删除数组中的特定元素;2、利用array_flip函数和unset函数删除数组中的特定值;3、利用array_search和unset函数删除数组中的特定值等等。
本文操作环境:windows7系统、PHP7.1版,DELL G3电脑
php删除数组中指定值的元素的几种方法
在一些特殊情况下,你需要删除数组中的特定值,而且要全部删除,其实方法有很多种,我们通过本文来进行讨论。
一、利用foreach和unset()函数删除数组中的特定元素
foreach($array as $k=>$v){if($v == 'day'){unset($array[$k]):}}
unset()函数即删除指定的数组值。
二、利用array_flip()函数和unset()函数删除数组中的特定值
$arr = array_flip($arr);unset($arr['world']);$arr = array_flip($arr);print_r($arr);
array_flip()是一个反转函数,将数组原来的键名变为键值,把键值变为键名,这样上面的操作就很容易理解了。
【推荐学习:《PHP视频教程》】
三、利用array_search()和unset()函数删除数组中的特定值
if(($key = array_search('day'$arr))){unset($arr[$key]);}
array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。
四、array_splice()函数可以与unset()函数起到相同作用
if(($key = array_search('day'$arr))){array_splice($arr, $key,1);}
array_splice()有四个参数,用法请看这里。
五、array_unique()让这个特定值在数组中一个不留
注意:上面的所有操作只是删除了数组中第一个和你给定的值相同的元素,之后的元素即使和你给定的值相等,却没有被删除!
在进行上面所有的代码操作之前,先进行array_unique($array)的操作,将数组中的重复值进行合并删除,再进行上面的删除,让数组中的重复值一个不留。
六、只删除特定值对应的键值,不动其他值
五中导致删除特定值的同时,也将其他无关的值合并了,那么不要动其他值怎么办?重复执行上面一~四的操作即可,获取数组长度,用一个for循环即可,当然这是最笨的办法~~
获取数组长度的函数是count($arr)for(count($arr))if($key = array_search('day'$arr))array_splice($arr,$key,1);

❹ php二维数组删除指定的重复元素,只保留一条

array_unique($array);直接可以移除重复值

❺ php怎么移除数组中的某个值

在PHP中,移除数组中的某个值可以通过以下几种方法实现:

  1. 利用foreach和unset函数

    • 遍历数组,当找到与指定值相等的元素时,使用unset函数删除该元素。
    • 示例代码:phpforeach { if { unset; }}2. 利用array_flip和unset函数: 使用array_flip函数反转数组,将键和值互换,然后使用unset函数删除指定值对应的键,最后再反转回来。 示例代码:php$arr = array_flip;unset;$arr = array_flip;print_r;
  2. 利用array_search和unset函数

    • 使用array_search函数查找指定值在数组中的键,然后使用unset函数删除该键对应的元素。
    • 示例代码:phpif )) { unset;}4. 利用array_splice函数: array_splice函数可以直接删除指定位置的元素,与unset函数作用类似,但需要知道要删除元素的键。 示例代码:phpif )) { array_splice;}
  3. 确保删除所有重复值后再进行删除操作

    • 如果需要删除数组中所有与指定值相等的元素,可以先使用array_unique函数去除重复值,再进行上述删除操作。但注意,直接使用array_unique可能会合并其他无关的值。
    • 示例代码:php$array = array_unique;// 然后结合前面的删除方法进行操作6. 只删除特定值对应的键值,不动其他值: 如果不希望影响其他值,可以重复执行上述的删除操作,直到所有指定值都被删除。这通常需要一个循环来判断和删除。 示例思路:使用count函数获取数组长度,在for循环中结合array_search和array_splice或unset进行删除,直到没有指定值为止。选择哪种方法取决于具体的需求和数组的结构。在进行数组操作前,建议先备份原始数组,以防误操作导致数据丢失。
阅读全文

与php数组删除重复元素相关的资料

热点内容
安卓项目部署到阿里云服务器 浏览:984
绿巨人视频app下载怎么用 浏览:736
android源码打包下载 浏览:693
卖服务器送什么 浏览:98
留言板分页php 浏览:288
jasperreportpdf 浏览:421
数据挖掘k中心点算法 浏览:544
程序员3年胖30斤 浏览:666
安卓系统课件如何转换微软 浏览:882
大数据有哪些算法 浏览:26
单片机如何焊接pcb 浏览:790
治愈网站源码 浏览:900
手机如何录入加密小区门禁卡软件 浏览:475
看游泳馆的课程用什么APP 浏览:235
北方租房用什么app 浏览:941
java水费管理系统源码 浏览:523
百思不得姐网站源码 浏览:816
java显示控制台 浏览:544
查新车报价哪个app最准 浏览:391
石油天然气压缩机 浏览:512