Was ist ein eleganter Weg, um ein Objekt aus einem Array von Objekten in PHP zu entfernen?
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
}
}
Sie können auch verwenden spl_object_hash um einen Hash für die Objekte zu erstellen und diesen als Array-Schlüssel zu verwenden.
Allerdings hat PHP auch eine native Datenstruktur für Objektsammlungen mit 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
SplObjectStorage Ist Traversablealso kannst du foreach auch drüber.
Nebenbei bemerkt, PHP hat auch native Schnittstellen für Thema Und Beobachter.
+1 das ist der beste Ansatz. Ganz zu schweigen davon, dass ab PHP 5.3 SplObjectStorage implementiert ArrayAccess.
– Ionuț G. Stan
26. August 2010 um 8:56 Uhr
Angesichts der Art der Frage überlegen Sie, ob search_array() kehrt zurück falsewäre das Beste, was zu tun wäre throw new OutOfBoundsException("No matching Observer found attached to the subject."). Bei genauer Betrachtung wäre dies eine Ausnahmesituation für einen Gebundenen Observer nicht mehr existieren! 🙂
– Anthony Rutledge
11. Februar 2021 um 2:00 Uhr
icio
Ich stimme den obigen Antworten zu, aber der Vollständigkeit halber (wenn Sie möglicherweise keine eindeutigen IDs als Schlüssel verwenden) sind meine bevorzugten Methoden zum Entfernen von Werten aus einem Array wie folgt:
/**
* 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;
});
}
Welche werden wie folgt verwendet:
$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'));
Cody Snider
Ich empfehle die Verwendung der ID (wenn Sie eine haben, sollte alles, was für dieses Objekt eindeutig ist, innerhalb des vernünftigen Rahmens funktionieren) des Objekts als Array-Schlüssel. Auf diese Weise können Sie das Objekt innerhalb des Arrays ansprechen, ohne eine Schleife durchlaufen oder die ID an einer anderen Stelle speichern zu müssen. Der Code würde in etwa so aussehen:
class Data{
private $arrObservers;
public add(Observer $o) {
$this->arrObservers[$o->getId()] = $o;
}
public remove(Observer $o) {
unset($this->arrObservers[$o->getId()]);
}
}
Sie benötigen jedoch eine getId()-Methode für das Observer-Objekt.
– Cody Snider
26. August 2010 um 8:49 Uhr
unset($myArray[$index]); Wo $index ist der Index des Elements, das Sie entfernen möchten. Wenn Sie eine genauere Antwort wünschen, zeigen Sie Code oder beschreiben Sie, was Sie versuchen.