dan*_*car 31 php arrays object
从PHP中的对象数组中删除对象的优雅方法是什么?
只是为了清楚..
class Data{
private $arrObservers;
public add(Observer $o) {
array_push($this->arrObservers, $o);
}
public remove(Observer $o) {
// I NEED THIS CODE to remove $o from $this->arrObservers
}
}
Run Code Online (Sandbox Code Playgroud)
Gor*_*don 50
你可以做
function unsetValue(array $array, $value, $strict = TRUE)
{
if(($key = array_search($value, $array, $strict)) !== FALSE) {
unset($array[$key]);
}
return $array;
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用spl_object_hash为对象创建哈希并将其用作数组键.
但是,PHP还有一个用于Object集合的本机数据结构SplObjectStorage:
$a = new StdClass; $a->id = 1;
$b = new StdClass; $b->id = 2;
$c = new StdClass; $c->id = 3;
$storage = new SplObjectStorage;
$storage->attach($a);
$storage->attach($b);
$storage->attach($c);
echo $storage->count(); // 3
// trying to attach same object again
$storage->attach($c);
echo $storage->count(); // still 3
var_dump( $storage->contains($b) ); // TRUE
$storage->detach($b);
var_dump( $storage->contains($b) ); // FALSE
Run Code Online (Sandbox Code Playgroud)
SplObjectStorage是的Traversable,所以你也可以foreach.
在旁注中,PHP还具有Subject和Observer的本机接口.
ici*_*cio 15
我同意上面的答案,但为了完整起见(你可能没有唯一的ID用作键)我从数组中删除值的首选方法如下:
/**
* Remove each instance of a value within an array
* @param array $array
* @param mixed $value
* @return array
*/
function array_remove(&$array, $value)
{
return array_filter($array, function($a) use($value) {
return $a !== $value;
});
}
/**
* Remove each instance of an object within an array (matched on a given property, $prop)
* @param array $array
* @param mixed $value
* @param string $prop
* @return array
*/
function array_remove_object(&$array, $value, $prop)
{
return array_filter($array, function($a) use($value, $prop) {
return $a->$prop !== $value;
});
}
Run Code Online (Sandbox Code Playgroud)
以下列方式使用:
$values = array(
1, 2, 5, 3, 5, 6, 7, 1, 2, 4, 5, 6, 6, 8, 8,
);
print_r(array_remove($values, 6));
class Obj {
public $id;
public function __construct($id) {
$this->id = $id;
}
}
$objects = array(
new Obj(1), new Obj(2), new Obj(4), new Obj(3), new Obj(6), new Obj(4), new Obj(3), new Obj(1), new Obj(5),
);
print_r(array_remove_object($objects, 1, 'id'));
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
我建议使用对象的ID(如果你有一个,那个对象应该是唯一的,应该在合理范围内工作)作为数组键.这样,您可以在数组中寻址对象,而无需运行循环或将ID存储在另一个位置.代码看起来像这样:
$obj_array[$obj1->getId()] = $obj1;
$obj_array[$obj2->getId()] = $obj2;
$obj_array[$obj3->getId()] = $obj3;
unset($obj_array[$object_id]);
Run Code Online (Sandbox Code Playgroud)
更新:
class Data{
private $arrObservers;
public add(Observer $o) {
$this->arrObservers[$o->getId()] = $o;
}
public remove(Observer $o) {
unset($this->arrObservers[$o->getId()]);
}
}
Run Code Online (Sandbox Code Playgroud)