《深入php 面向对象、模式与实践》的159页有下面的代码。
这儿是演示组合模式,removeunit那个方法里用到了array_udiff函数。作者的本意是这样可以从 $units 属性里去除$unit 对象。我试了发现不起作用,关键就在$units参数里存的是对象,对象做比较时不能排序,所以就失败了。大家有没有好的方法可以从数组里排除掉一个对象吗?
<br>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免费学习笔记(深入)”;
《深入php 面向对象、模式与实践》的159页有下面的代码。
这儿是演示组合模式,removeunit那个方法里用到了array_udiff函数。作者的本意是这样可以从 $units 属性里去除$unit 对象。我试了发现不起作用,关键就在$units参数里存的是对象,对象做比较时不能排序,所以就失败了。大家有没有好的方法可以从数组里排除掉一个对象吗?
<br>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免费学习笔记(深入)”;
直接循环和unset解决了。
foreach($this->units as $k => $u){
if($u === $unit){
unset($this->units[$k]);
}
}
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号