46 votes

Comment supprimer un objet d'un tableau?

Quelle est une façon élégante de supprimer un objet d'un tableau d'objets en PHP ?

class Data{

  private $arrObservers;

  public add(Observer $o) {  
    array_push($this->arrObservers, $o);  
  }    
  public remove(Observer $o) {  
    // J'AI BESOIN DE CE CODE pour supprimer $o de $this->arrObservers
  }  

}

64voto

Gordon Points 156415

Vous pouvez le faire

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

Vous pouvez également utiliser spl_object_hash pour créer un hash pour les objets et l'utiliser comme clé de tableau.

Cependant, PHP a également une Structure de Données native pour les collections d'objets avec 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 est Traversable, donc vous pouvez aussi foreach dessus.

En passant, PHP a également des interfaces natives pour Sujet et Observateur.

22voto

icio Points 1333

Je suis d'accord avec les réponses ci-dessus, mais pour des raisons de complétude (lorsque vous n'avez pas d'identifiants uniques à utiliser comme clé), mes méthodes préférées pour supprimer des valeurs d'un tableau sont les suivantes :

/**
 * Supprime chaque instance d'une valeur dans un tableau
 * @param array $array
 * @param mixed $value
 * @return array
 */
function array_remove(&$array, $value)
{
    return array_filter($array, function($a) use($value) {
        return $a !== $value;
    });
}

/**
 * Supprime chaque instance d'un objet dans un tableau (correspondant à une propriété donnée, $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;
    });
}

Qui sont utilisées de la manière suivante :

$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'));

8voto

Lav Patel Points 131

Je recommande d'utiliser l'ID (si vous en avez un, tout ce qui sera unique à cet objet devrait fonctionner dans une certaine mesure) de l'objet comme clé du tableau. De cette façon, vous pouvez accéder à l'objet dans le tableau sans avoir à parcourir une boucle ou à stocker l'ID ailleurs. Le code ressemblerait à ceci:

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

unset($obj_array[$object_id]);

MISE À JOUR:

class Data{

  private $arrObservers;

  public add(Observer $o) {  
    $this->arrObservers[$o->getId()] = $o;  
  }    
  public remove(Observer $o) {  
    unset($this->arrObservers[$o->getId()]);
  }  

}

5voto

Tatu Ulmanen Points 52098

unset($myArray[$index]);$index est l'index de l'élément que vous voulez supprimer. Si vous voulez une réponse plus spécifique, montrez du code ou décrivez ce que vous essayez de faire.

4voto

plutov.by Points 8991
$obj_array['obj1'] = $obj1;
$obj_array['obj2'] = $obj2;
$obj_array['obj3'] = $obj3;
unset($obj_array['obj3']);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X