亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

PHP數(shù)組去重有哪些最佳實(shí)踐

紅蓮之龍
發(fā)布: 2025-02-17 16:48:19
原創(chuàng)
1243人瀏覽過(guò)
問(wèn)題:PHP如何高效地對(duì)數(shù)組進(jìn)行去重?答案:本文介紹了多種PHP數(shù)組去重策略,包括:僅考慮值的array_unique()保留鍵值對(duì)的uniqueArrayByKey()使用值作為鍵的uniqueArrayByValuePreserveKeys()針對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的自定義比較函數(shù)

PHP數(shù)組去重有哪些最佳實(shí)踐

PHP數(shù)組去重:不止是array_unique()那么簡(jiǎn)單

很多PHP新手,甚至一些老手,面對(duì)數(shù)組去重,第一反應(yīng)就是array_unique()。這當(dāng)然是個(gè)辦法,但它真的夠好嗎? 本文的目的,就是帶你深入探究PHP數(shù)組去重的各種技巧,以及它們背后的玄機(jī),讓你寫(xiě)出更高效、更優(yōu)雅、更健壯的代碼。讀完之后,你將不再滿足于簡(jiǎn)單的array_unique(),而是能根據(jù)實(shí)際情況選擇最合適的方案。

基礎(chǔ)知識(shí)回顧:PHP數(shù)組的本質(zhì)

在開(kāi)始之前,我們需要明確一點(diǎn):PHP數(shù)組并非其他語(yǔ)言中嚴(yán)格意義上的數(shù)組。它更像是一個(gè)有序映射,鍵值對(duì)的集合。理解這一點(diǎn),對(duì)我們選擇去重方法至關(guān)重要。array_unique()只考慮值,忽略鍵,這在某些情況下可能并非我們想要的結(jié)果。

核心概念:數(shù)組去重的多種策略

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

array_unique()只是眾多策略之一。它的工作原理很簡(jiǎn)單:遍歷數(shù)組,保留每個(gè)值的第一次出現(xiàn)。 但它有個(gè)巨大的局限性:它只對(duì)值進(jìn)行比較,如果數(shù)組中存在相同的數(shù)值但鍵不同,array_unique()并不會(huì)去除重復(fù)的值。

讓我們看看更強(qiáng)大的方法:

<code class="php"><?php

function uniqueArrayByValue($arr) {
  return array_values(array_unique($arr)); // 保留原始值的順序
}

function uniqueArrayByKey($arr) {
    $result = [];
    foreach ($arr as $key => $value) {
        $result[$key] = $value; // 保留原始鍵值對(duì)
    }
    return $result;
}

function uniqueArrayByValuePreserveKeys($arr){
  $unique = [];
  foreach ($arr as $key => $value) {
    if (!isset($unique[$value])) {
      $unique[$value] = $value; // 使用值作為鍵,確保唯一性
    }
  }
  return $unique; //保留第一個(gè)出現(xiàn)的鍵
}

$array = [1, 2, 2, 3, 4, 4, 5, 1, 6];
$array2 = ['a' => 1, 'b' => 2, 'c' => 2, 'd' => 3];
$array3 = ['apple' => 1, 'banana' => 2, 'orange' => 1, 'grape' => 3];

print_r(uniqueArrayByValue($array)); // 去重,并保留原始順序
print_r(uniqueArrayByKey($array2)); // 保留原始鍵值對(duì),不去重
print_r(uniqueArrayByValuePreserveKeys($array3)); //去重,保留第一個(gè)出現(xiàn)的鍵

?></code>
登錄后復(fù)制

uniqueArrayByValue() 解決了array_unique()的潛在問(wèn)題,它先用array_unique()去重,再用array_values()重置鍵,保證了原始值的順序。

array_unique()0則完全保留了原始鍵值對(duì),不做任何去重操作。

array_unique()1則巧妙地利用值作為鍵來(lái)實(shí)現(xiàn)去重,保留了第一個(gè)出現(xiàn)的鍵。

怪獸AI數(shù)字人
怪獸AI數(shù)字人

數(shù)字人短視頻創(chuàng)作,數(shù)字人直播,實(shí)時(shí)驅(qū)動(dòng)數(shù)字人

怪獸AI數(shù)字人44
查看詳情 怪獸AI數(shù)字人

高級(jí)用法:針對(duì)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的去重

如果數(shù)組元素是復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如對(duì)象或關(guān)聯(lián)數(shù)組,array_unique()就顯得力不從心了。這時(shí)候,我們需要自定義比較函數(shù)。

<code class="php"><?php

class User {
    public $id;
    public $name;

    public function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
    }
}

function uniqueUsers(array $users): array {
    $uniqueUsers = [];
    $seenIds = [];
    foreach ($users as $user) {
        if (!in_array($user->id, $seenIds)) {
            $uniqueUsers[] = $user;
            $seenIds[] = $user->id;
        }
    }
    return $uniqueUsers;
}

$users = [
    new User(1, 'John'),
    new User(2, 'Jane'),
    new User(1, 'John'),
    new User(3, 'Peter'),
];

$uniqueUsers = uniqueUsers($users);
//輸出去重后的User對(duì)象數(shù)組

foreach ($uniqueUsers as $user) {
    echo $user->name . PHP_EOL;
}

?></code>
登錄后復(fù)制

這個(gè)例子展示了如何根據(jù)對(duì)象的array_unique()3屬性進(jìn)行去重。 你可以根據(jù)實(shí)際需求修改比較邏輯。

性能優(yōu)化與最佳實(shí)踐

對(duì)于大型數(shù)組,array_unique()的性能可能會(huì)成為瓶頸。 考慮使用更有效的算法,例如哈希表。 不過(guò),PHP的內(nèi)置函數(shù)通常已經(jīng)經(jīng)過(guò)了優(yōu)化,除非你的數(shù)組規(guī)模極其龐大,否則不必過(guò)度擔(dān)心性能問(wèn)題。

更重要的是,編寫(xiě)清晰、可維護(hù)的代碼。 選擇合適的去重策略,并添加必要的注釋,讓你的代碼易于理解和修改。 避免過(guò)度優(yōu)化,除非你真的遇到了性能瓶頸。

記住,沒(méi)有一種通用的“最佳實(shí)踐”適用于所有情況。 選擇合適的方案取決于你的具體需求和數(shù)組的特性。 希望本文能幫助你更好地理解PHP數(shù)組去重,并寫(xiě)出更優(yōu)秀的代碼。

以上就是PHP數(shù)組去重有哪些最佳實(shí)踐的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

PHP速學(xué)教程(入門(mén)到精通)
PHP速學(xué)教程(入門(mén)到精通)

PHP怎么學(xué)習(xí)?PHP怎么入門(mén)?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門(mén)到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來(lái)源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問(wèn)題
開(kāi)源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見(jiàn)反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)