您好,欢迎访问一九零五行业门户网

如何找出PHP对象数组的差值?

《深入php 面向对象、模式与实践》的159页有下面的代码。
这儿是演示组合模式,removeunit那个方法里用到了array_udiff函数。作者的本意是这样可以从 $units 属性里去除$unit 对象。我试了发现不起作用,关键就在$units参数里存的是对象,对象做比较时不能排序,所以就失败了。大家有没有好的方法可以从数组里排除掉一个对象吗?
class army extends unit{
private $units = array();function addunit(unit $unit){ if(in_array($unit, $this->units, true)){ return; } $this->units[] = $unit;} function removeunit(unit $unit){ $this->units = array_udiff($this->units, array($unit), function ($a, $b) { return ($a === $b) ? 0: 1;}); } function bombardstrength(){ $ret = 0; foreach($this->units as $unit){ $ret += $unit->bombardstrength(); } return $ret;}

}
$army = new army;
$archer = new archer();//$archer->addunit(new archer);$army->addunit($archer);$army->addunit($archer);$army->addunit(new archer);$army->addunit(new lasercannonunit);

$army2 = new army();$army2->addunit(new archer);$army2->addunit($archer);$army2->addunit($archer);$army2->removeunit($archer);$army->addunit($army2);$army->addunit($army2);print_r($army);echo $army->bombardstrength().\n;$army->removeunit($army2);$army->removeunit($army2);$army->removeunit($army2);$army->removeunit($archer);echo $army->bombardstrength();print_r($army);

回复内容: 《深入php 面向对象、模式与实践》的159页有下面的代码。
这儿是演示组合模式,removeunit那个方法里用到了array_udiff函数。作者的本意是这样可以从 $units 属性里去除$unit 对象。我试了发现不起作用,关键就在$units参数里存的是对象,对象做比较时不能排序,所以就失败了。大家有没有好的方法可以从数组里排除掉一个对象吗?
class army extends unit{
private $units = array();function addunit(unit $unit){ if(in_array($unit, $this->units, true)){ return; } $this->units[] = $unit;} function removeunit(unit $unit){ $this->units = array_udiff($this->units, array($unit), function ($a, $b) { return ($a === $b) ? 0: 1;}); } function bombardstrength(){ $ret = 0; foreach($this->units as $unit){ $ret += $unit->bombardstrength(); } return $ret;}

}
$army = new army;
$archer = new archer();//$archer->addunit(new archer);$army->addunit($archer);$army->addunit($archer);$army->addunit(new archer);$army->addunit(new lasercannonunit);

$army2 = new army();$army2->addunit(new archer);$army2->addunit($archer);$army2->addunit($archer);$army2->removeunit($archer);$army->addunit($army2);$army->addunit($army2);print_r($army);echo $army->bombardstrength().\n;$army->removeunit($army2);$army->removeunit($army2);$army->removeunit($army2);$army->removeunit($archer);echo $army->bombardstrength();print_r($army);

直接循环和unset解决了。
foreach($this->units as $k => $u){ if($u === $unit){ unset($this->units[$k]); } }
其它类似信息

推荐信息