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
  }  

}

1voto

tomloprod Points 4004

Pour supprimer un objet d'un tableau multidimensionnel, vous pouvez utiliser ceci :

$exampleArray= [
    [
      "myKey"=>"Ceci est ma clé",
      "myValue"=>"10"
    ],
    [
      "myKey"=>"Oh!",
      "myValue"=>"11"
    ]
];

Avec array_column, vous pouvez spécifier le nom de votre colonne clé :

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

Et cela supprimera l'objet indiqué.

0voto

thinice Points 505

Utilisez ceci pour votre stockage d'objets internes à la place : https://www.php.net/manual/en/class.splobjectstorage.php

0voto

user1596471 Points 61
 function obj_array_clean ($array, $objId)
 {
    $new = array() ;
    foreach($array as $value)
    {
        $new[$value->{$objId}] = $value;
    }
    $array = array_values($new);
    return $array;
 }

 $ext2 = obj_array_clean($ext, 'OnjId');
  • Il supprimera l'objet "OnjId" en double de l'array d'objets $array.

0voto

Minwork Points 488

Si vous souhaitez supprimer un ou plusieurs objets d'un tableau d'objets (en utilisant spl_object_hash pour déterminer si les objets sont identiques), vous pouvez utiliser cette méthode :

$this->arrObservers = Arr::diffObjects($this->arrObservers, [$o]);

de cette bibliothèque.

0voto

Anthony Rutledge Points 280

Lecture de la partie du livre GoF sur le modèle Observer ? Voici une solution qui éliminera le besoin de faire une recherche coûteuse pour trouver l'indice de l'objet que vous souhaitez supprimer.

public function addObserver(string $aspect, string $viewIndex, Observer $view)
{   
    $this->observers[$aspect][$viewIndex] = $view;
}

public function removeObserver(string $aspect, string $viewIndex)
{
    if (!isset($this->observers[$aspect])) {
        throw new OutOfBoundsException("Aucun aspect tel que ({$aspect}) n'existe dans ce modèle : " . __CLASS__);
    }

    if (!isset($this->observers[$aspect][$viewIndex])) {
        throw new OutOfBoundsException("Aucune vue pour ({$viewIndex}) n'a été ajoutée à l'aspect ({$aspect}) de ce modèle : " . __CLASS__);
    }

    unset($this->observers[$aspect][$viewIndex]);
}

Vous pouvez supprimer la dimension "aspect" si vous n'utilisez pas cette méthode pour suivre quelles Vues sont mises à jour par des Modèles spécifiques.

public function addObserver(string $viewIndex, Observer $view)
{   
    $this->observers[$viewIndex] = $view;
}

public function removeObserver(string $viewIndex)
{   
    if (!isset($this->observers[$viewIndex])) {
        throw new OutOfBoundsException("Aucune vue pour ({$viewIndex}) n'a été ajoutée à ce modèle : " . __CLASS__);
    }

    unset($this->observers[$viewIndex]);
}

Résumé

Construisez un moyen de trouver l'élément avant d'assigner l'objet au tableau. Sinon, vous devrez découvrir d'abord l'indice de l'élément objet.

Si vous avez un grand nombre d'éléments objets (ou même plus qu'une poignée), alors vous devrez probablement trouver l'indice de l'objet en premier. La fonction PHP array_search() est une manière de commencer avec une valeur et obtenir en retour l'indice/clé.

https://www.php.net/manual/en/function.array-search.php

N'oubliez pas d'utiliser l'argument strict lorsque vous appelez la fonction.

Si le troisième paramètre strict est défini sur true, alors la fonction array_search() recherchera des éléments identiques dans la pile. Cela signifie qu'elle effectuera également une comparaison de type stricte de l'aiguille dans la pile, et les objets doivent être la même instance.

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