Intereting Posts
Кажется, что preg_match достигает предела при использовании двух совпадений Проблемы с сессией в Homestead 4.2 Как использовать самоподписанный сертификат с XAMPP для запросов HTTPS с использованием cURL? Преобразование между нелогично отформатированными датами (смена / слэш / на -dash-) Вопрос о включении html-страницы в PHP Неожиданный T_PAAMAYIM_NEKUDOTAYIM, ожидающий T_NS_Separator Сообщения Laravel Debugbar, не показывающие Ошибка синтаксиса: Неожиданное число в Object.parse, PHP для AngularJS Ошибка JQuery Ajax и возврат исключения? PHP: пользовательский обработчик ошибок – обработка синтаксических ошибок и фатальных ошибок Добавьте заголовок к каждому запросу с использованием .htaccess случайная ошибка symfony: ContextErrorException: Warning: simplexml_load_file (): предупреждение ввода-вывода: не удалось загрузить внешний объект Laravel 5.1 Загрузка файлов Безопасность Приоритет транзакций? Открытие документа Word в режиме чтения с использованием php?

PHP: удалить объект из массива

Каков элегантный способ удаления объекта из массива объектов в 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 } } 

Ты можешь сделать

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

Вы также можете использовать spl_object_hash для создания хэша для объектов и использовать его как ключ массива.

Тем не менее, PHP также имеет собственную структуру Data Structure для 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 

SplObjectStorage является Traversable , поэтому вы можете также предусмотреть его.

На стороне sidenote PHP также имеет собственные интерфейсы для Subject и Observer .

Я согласен с ответами выше, но для полноты (где у вас могут не быть уникальных идентификаторов для использования в качестве ключа) мои предпочтительные методы удаления значений из массива следующие:

 /** * 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; }); } 

Которые используются следующим образом:

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

Надеюсь, это поможет.

Я рекомендую использовать идентификатор (если он есть, что-то, что будет уникальным для этого объекта, должно работать в пределах разумного) объекта в качестве ключа массива. Таким образом, вы можете обращаться к объекту внутри массива, не выполняя цикл или сохраняя идентификатор в другом месте. Код будет выглядеть примерно так:

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

ОБНОВИТЬ:

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

unset($myArray[$index]); с unset($myArray[$index]); где $index – это индекс элемента, который вы хотите удалить. Если вы не получите более конкретного ответа, покажите код или опишите, что вы пытаетесь сделать.

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

Для удаления объекта из multi dimensional array вы можете использовать это:

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

С помощью array_column вы можете указать имя своего ключевого столбца:

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

И это приведет к удалению указанного объекта.

Вместо этого используйте это для внутреннего хранилища объектов: http://us2.php.net/manual/en/class.splobjectstorage.php

  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'); 
  • Он удалит дублирующий объект «OnjId» из массива $ array.

Попробуйте это, решит вашу проблему.

 class Data{ private $arrObservers; public add(Observer $o) { array_push($this->arrObservers,$o); } public remove($Observer $o) { unset($this->arrObservers[$o]); } } не class Data{ private $arrObservers; public add(Observer $o) { array_push($this->arrObservers,$o); } public remove($Observer $o) { unset($this->arrObservers[$o]); } } 

Я считаю, что это лучший способ

 $index = array_search($o, $this->arrObservers, true); unset($this->arrObservers[$index]);