導航:首頁 > 編程語言 > 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