首页 / PHP / php – 将对象集合限制为唯一集合
php – 将对象集合限制为唯一集合
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 将对象集合限制为唯一集合,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1566字,纯文字阅读大概需要3分钟。
内容图文
![php – 将对象集合限制为唯一集合](/upload/InfoBanner/zyjiaocheng/783/a0ade9c4bc0b42508e2de9c487bcd8c7.jpg)
目前我有一个名为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 – 将对象集合限制为唯一集合全部内容,希望文章能够帮你解决php – 将对象集合限制为唯一集合所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。