第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么 array_unique 不檢測(cè)重復(fù)對(duì)象?

為什么 array_unique 不檢測(cè)重復(fù)對(duì)象?

我似乎無(wú)法弄清楚 PHP 場(chǎng)景背后發(fā)生了什么魔法以及為什么array_unique無(wú)法檢測(cè)到我的重復(fù)項(xiàng)。在我的具體情況下,我有 2 個(gè)用戶集合,我將它們合并為一個(gè),然后只保留唯一的條目。為此,我將兩個(gè)集合都轉(zhuǎn)換為數(shù)組,array_merge()然后基于參數(shù)應(yīng)用array_unique(..., SORT_REGULAR),以便將它們作為對(duì)象進(jìn)行比較而無(wú)需任何轉(zhuǎn)換。我意識(shí)到比較對(duì)象是一個(gè)滑坡,但在這種情況下它比我想象的更奇怪。合并之后但在唯一性檢查之前我有這個(gè)狀態(tài):如您所見(jiàn),第 4 項(xiàng)和第 11 項(xiàng)是相同的用戶實(shí)體(非嚴(yán)格比較和嚴(yán)格比較都同意這一點(diǎn))。然而,array_unique()由于某種原因,他們都留在了名單中:如您所見(jiàn),第 7-10 項(xiàng)已被檢測(cè)并刪除,但第 11 項(xiàng)沒(méi)有。這怎么可能?我在這里沒(méi)有看到什么?當(dāng)前運(yùn)行 PHP 7.4.5代碼來(lái)自使用 Symfony 4.4.7 和 Doctrine ORM 2.7.2 的項(xiàng)目(盡管我認(rèn)為這應(yīng)該是無(wú)關(guān)緊要的,如果對(duì)象在比較==和===比較中都是相等的)。獎(jiǎng)勵(lì)積分的有趣事實(shí) -array_unique連續(xù)申請(qǐng)兩次實(shí)際上會(huì)產(chǎn)生獨(dú)特的結(jié)果:頭腦=吹更新:throw new \RuntimeException()我在我的方法中添加了User::__toString(),以額外確保沒(méi)有人正在轉(zhuǎn)換為字符串。請(qǐng)不要建議轉(zhuǎn)換為字符串 - 這既不是我的問(wèn)題的解決方案,也不是這個(gè)問(wèn)題的內(nèi)容。
查看完整描述

3 回答

?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊

array_unique對(duì)于您手頭的問(wèn)題,我真的懷疑這是從使用標(biāo)志時(shí)從數(shù)組中刪除元素的方式來(lái)的?SORT_REGULAR,方法是:

  1. 整理它

  2. 如果相鄰項(xiàng)相等,則刪除它們

Proxy而且因?yàn)槟氖詹刂虚g確實(shí)有一個(gè)對(duì)象User,這可能會(huì)導(dǎo)致您遇到當(dāng)前面臨的問(wèn)題。

這似乎得到了sortPHP 文檔頁(yè)面警告的支持。

警告對(duì)具有混合類(lèi)型值的數(shù)組進(jìn)行排序時(shí)要小心,因?yàn)槿绻?code>sort(),可能會(huì)產(chǎn)生意想不到的結(jié)果。sort_flagsSORT_REGULAR


現(xiàn)在對(duì)于一個(gè)可能的解決方案,這可能會(huì)給你帶來(lái)更多 Symfony 風(fēng)味的東西。

它使用ArrayCollection?filterandcontains方法來(lái)過(guò)濾第二個(gè)集合,只添加第一個(gè)集合中不存在的元素。
為了完全完整,該解決方案還利用use語(yǔ)言結(jié)構(gòu)將第二個(gè)傳遞ArrayCollection給所需的閉包函數(shù)filter

這將導(dǎo)致一個(gè)新的ArrayCollection不包含重復(fù)的用戶。

public static function merge(Collection $a, Collection $b, bool $unique = false): Collection {

? if($unique){

? ? return new ArrayCollection(

? ? ? array_merge(

? ? ? ? $a->toArray(),

? ? ? ? $b->filter(function($item) use ($a){

? ? ? ? ? return !$a->contains($item);

? ? ? ? })->toArray()

? ? ? )

? ? );

? }


? return new ArrayCollection(array_merge($a->toArray(), $b->toArray()));

}


查看完整回答
反對(duì) 回復(fù) 2023-04-02
?
炎炎設(shè)計(jì)

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊

我知道你說(shuō)你不想轉(zhuǎn)換為字符串,但我看到你還沒(méi)有出路,所以我建議你對(duì)serialize數(shù)組中的每個(gè)對(duì)象使用該函數(shù),我沒(méi)有找到方法比較未轉(zhuǎn)換為數(shù)組或字符串的對(duì)象(如果您不熟悉字符串或數(shù)組,則不能?chē)L試轉(zhuǎn)換為二進(jìn)制或十六進(jìn)制,但我不知道是否可以轉(zhuǎn)換為二進(jìn)制或十六進(jìn)制而不轉(zhuǎn)換為字符串).


但是,如果你使用serialize,你可以在 php 的讀取數(shù)據(jù)中序列化對(duì)象,與其他序列化對(duì)象相比,這個(gè)方法 ( serialize) 是安全的,因?yàn)槟憧梢宰鲆粋€(gè)unserialize, 并再次獲得原始對(duì)象。


所以你可以序列化數(shù)組中的所有元素,然后,你可以array_unique像這樣使用:


<?php


header("Content-Type: application/json");


class MyClass

{

    public $var1;

    public $var2;

    function __construct($var1, $var2)

    {

        $this->var1 = $var1;

        $this->var2 = $var2;

    }


}


$arr = [

    "a",

    "a",

    [1,2,3],

    "b",

    [1,2,3],

    new MyClass(1,1),

    new MyClass(1,new MyClass(1,1)),

    new MyClass(1,new MyClass(1,1)),

];


$arrSerilized = array_map("serialize", $arr);


var_dump(

    array_map(

        "unserialize",

        array_unique(

            $arrSerilized,

            SORT_STRING

        )

    )

);


/* output:

array(5) {

    [0]=>

    string(1) "a"

    [2]=>

    array(3) {

        [0]=>

        int(1)

        [1]=>

        int(2)

        [2]=>

        int(3)

    }

    [3]=>

    string(1) "b"

    [5]=>

    object(MyClass)#6 (2) {

        ["var1"]=>

        int(1)

        ["var2"]=>

        int(1)

    }

    [6]=>

    object(MyClass)#7 (2) {

        ["var1"]=>

        int(1)

        ["var2"]=>

        object(MyClass)#8 (2) {

            ["var1"]=>

            int(1)

            ["var2"]=>

            int(1)

        }

    }

}

*/

希望這對(duì)你有幫助,祝你有美好的一天!


PS:你serialize可以在不同的變量類(lèi)型中保存相同的值,比如1在"1"不同的php讀取數(shù)據(jù)中序列化


查看完整回答
反對(duì) 回復(fù) 2023-04-02
?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊

在不了解您的實(shí)體類(lèi)的情況下,很難猜測(cè)為什么會(huì)這樣。但我想你的主要問(wèn)題是__toString()method 。如果您尚未定義它,則應(yīng)添加一個(gè),以便它為每個(gè)實(shí)體對(duì)象返回一個(gè)唯一/不同的字符串。如果它已經(jīng)定義,請(qǐng)確保它返回不同的字符串。


class User{ 

   private $name;


   function __construct($name){ 

      $this->name=$name;

   }


   function __toString(){ 

     return $this->name; 

   }

}


$user = [];

$users[] = new User("User1");

$users[] = new User("User2");

$users[] = new User("User3");


$user1= $users[0];

$users[]=$user1; //duplicate


echo(count(array_unique($users))); // output should be 3

鑒于有關(guān)實(shí)體類(lèi)的信息有限,我可以猜到這里。


編輯:


閱讀您的編輯后,我猜您將自己鎖定在其中。Sincearray_unique將根據(jù)您傳遞的 sort_flag 嘗試將實(shí)體對(duì)象轉(zhuǎn)換為字符串或數(shù)字。更多關(guān)于array_unique。因此,您需要實(shí)現(xiàn) __toString() 或添加一些公共屬性來(lái)定義對(duì)象對(duì)實(shí)體的唯一性,例如


class User{ 

       public $id;

       private $name;


       function __construct($id,$name){

          $this->id=$id;

          $this->name=$name;

       }

}


$user = [];

$users[] = new User(1,"User1");

$users[] = new User(2,"User2");

$users[] = new User(3,"User3");


$user1= $users[0];

$users[]=$user1; //duplicate

echo(count(array_unique($users, SORT_REGULAR))); // output should be 3

請(qǐng)注意公共財(cái)產(chǎn)$id和SORT_REGULAR旗幟。


查看完整回答
反對(duì) 回復(fù) 2023-04-02
  • 3 回答
  • 0 關(guān)注
  • 180 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)