php 创建一个对象集合,php – 将对象集合限制为唯一集合

目前我有一个名为Collection的PHP类.它使用数组来保存一组唯一对象.它们是唯一的,不是因为它们具有不同的内存地址(尽管它们显然是这样),但是在集合中没有等效的对象.

我一直在阅读SplObjectStorage,它比数组具有明显的速度优势,并且可能比我的Collection类更容易维护.我的问题是SplObjectStorage不关心等价,只关注身份.例如:

class Foo {

public $id;

function __construct($int){

$this->id=$int;

}

function equals(self $obj){

return $this->id==$obj->id;

}

}

$f1a = new Foo(1);

$f1b = new Foo(1);//equivalent to $f1a

$f2a = new Foo(2);

$f2b = $f2a; //identical to $f2a

$s=new SplObjectStorage;

$s->attach($f1a);

$s->attach($f1b);//attaches (I don't want this)

$s->attach($f2a);

$s->attach($f2b);//does not attach (I want this)

foreach($s as $o) echo $o->id; //1 1 2, but I wish it would be 1 2

所以我一直在思考如何子类化SplObjectStorage,因此它的attach()会被对象等价限制,但到目前为止它涉及将对象的$data设置为“等价签名”,这似乎需要循环通过数据结构直到我找到(或不找到)匹配值.

例如.:

class MyFooStorage extends SplObjectStorage {

function attach(Foo $obj){

$es=$obj->id;

foreach($this as $o=>$data) {//this is the inefficient bit

if($es==$data) return;

}

parent::attach($obj);

$this[$obj]=$es;

}

}

有没有更好的办法?

解决方法:

如果唯一定义相等的东西是相对于另一个对象,那么我担心你想要的东西是不可能的.想想看,除非我检查每个对象,否则无法确定对象是否已包含在数组中,因此无论如何我都会有O(n)的复杂性.

但是,如果你使等式绝对,那么这是可能的.为此,您必须为每个对象生成哈希值.当且仅当它们的哈希相等时,两个对象才是相等的.一旦你有了,那么你可以用HashMap实现O(1).

在引擎盖下,这正是SplObjectStorage所做的,通过将对象的地址作为其哈希值.

标签:php,activerecord,spl

来源: https://codeday.me/bug/20190630/1339918.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值