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
}
}
Ответы
Ответ 1
Вы можете сделать
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
, поэтому вы можете foreach
и над ним.
В sidenote PHP также имеет встроенные интерфейсы для Subject и Observer.
Ответ 2
Я согласен с ответами выше, но для полноты (где у вас могут не быть уникальных идентификаторов для использования в качестве ключа) мои предпочтительные методы удаления значений из массива следующие:
/**
* 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'));
Надеюсь, что это поможет.
Ответ 3
Я рекомендую использовать идентификатор (если у вас есть, что-либо, что будет уникальным для этого объекта, должно работать в пределах разумного) объекта в качестве ключа массива. Таким образом, вы можете обращаться к объекту внутри массива, не выполняя цикл или сохраняя идентификатор в другом месте. Код будет выглядеть примерно так:
$obj_array[$obj1->getId()] = $obj1;
$obj_array[$obj2->getId()] = $obj2;
$obj_array[$obj3->getId()] = $obj3;
unset($obj_array[$object_id]);
UPDATE:
class Data{
private $arrObservers;
public add(Observer $o) {
$this->arrObservers[$o->getId()] = $o;
}
public remove(Observer $o) {
unset($this->arrObservers[$o->getId()]);
}
}
Ответ 4
unset($myArray[$index]);
где $index
- это индекс элемента, который вы хотите удалить. Если вы не получите более конкретного ответа, покажите код или опишите, что вы пытаетесь сделать.
Ответ 5
$obj_array['obj1'] = $obj1;
$obj_array['obj2'] = $obj2;
$obj_array['obj3'] = $obj3;
unset($obj_array['obj3']);
Ответ 6
Для удаления объекта из 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]);
}
И это приведет к удалению указанного объекта.
Ответ 7
Используйте это вместо внутреннего хранилища объектов: http://us2.php.net/manual/en/class.splobjectstorage.php
Ответ 8
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.
Ответ 9
Попробуйте это, решит вашу проблему.
class Data{
private $arrObservers;
public add(Observer $o) {
array_push($this->arrObservers,$o);
}
public remove($Observer $o) {
unset($this->arrObservers[$o]);
}
}
Ответ 10
Я считаю, что это лучший способ
$index = array_search($o, $this->arrObservers, true);
unset($this->arrObservers[$index]);