Wie entferne ich ein Objekt aus dem Array?

Lesezeit: 4 Minuten

Benutzeravatar von johnlemon
Johnlemon

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
  }  
  
}

Gordons Benutzeravatar
Gordon

Du kannst tun

function unsetValue(array $array, $value, $strict = TRUE)
{
    if(($key = array_search($value, $array, $strict)) !== FALSE) {
        unset($array[$key]);
    }
    return $array;
}

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


Benutzeravatar von icio
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'));

Benutzeravatar von Cody Snider
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:

$obj_array[$obj1->getId()] = $obj1;
$obj_array[$obj2->getId()] = $obj2;
$obj_array[$obj3->getId()] = $obj3;

unset($obj_array[$object_id]);

AKTUALISIEREN:

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.

$obj_array['obj1'] = $obj1;
$obj_array['obj2'] = $obj2;
$obj_array['obj3'] = $obj3;
unset($obj_array['obj3']);

  • -1, weil OP der Funktion ein Objekt gibt, nicht dem Schlüssel, und daher ist dieses Beispiel unvollständig.

    – Mikulas Dite

    27. August 2010 um 8:58 Uhr

Zum Entfernen eines Objekts aus a multi dimensional array Sie können dies verwenden:

$exampleArray= [
    [
      "myKey"=>"This is my key",
      "myValue"=>"10"
    ],
    [
      "myKey"=>"Oh!",
      "myValue"=>"11"
    ]
];

Mit array_column Sie können den Namen Ihrer Schlüsselspalte angeben:

if(($key = array_search("Oh!", array_column($exampleArray, 'myKey'))) !== false) {
    unset($exampleArray[$key]);
}

Und dies wird das angegebene Objekt entfernen.

  • -1, weil OP der Funktion ein Objekt gibt, nicht dem Schlüssel, und daher ist dieses Beispiel unvollständig.

    – Mikulas Dite

    27. August 2010 um 8:58 Uhr

Benutzeravatar von thinice
dünnes Eis

Verwenden Sie dies stattdessen für Ihren internen Objektspeicher: http://us2.php.net/manual/en/class.splobjectstorage.php

1445010cookie-checkWie entferne ich ein Objekt aus dem Array?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy