3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
array_unique
對(duì)于您手頭的問(wèn)題,我真的懷疑這是從使用標(biāo)志時(shí)從數(shù)組中刪除元素的方式來(lái)的?SORT_REGULAR
,方法是:
整理它
如果相鄰項(xiàng)相等,則刪除它們
Proxy
而且因?yàn)槟氖詹刂虚g確實(shí)有一個(gè)對(duì)象User
,這可能會(huì)導(dǎo)致您遇到當(dāng)前面臨的問(wèn)題。
這似乎得到了sort
PHP 文檔頁(yè)面警告的支持。
警告對(duì)具有混合類(lèi)型值的數(shù)組進(jìn)行排序時(shí)要小心,因?yàn)槿绻?code>sort(),可能會(huì)產(chǎn)生意想不到的結(jié)果。
sort_flags
SORT_REGULAR
現(xiàn)在對(duì)于一個(gè)可能的解決方案,這可能會(huì)給你帶來(lái)更多 Symfony 風(fēng)味的東西。
它使用ArrayCollection
?filter
andcontains
方法來(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()));
}

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ù)中序列化

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旗幟。
- 3 回答
- 0 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)