2010-11-12 11 views
22

Mam tablicę obiektów tak:Znajdź klucz tablicy w obiektach tablicy podana wartość atrybutu

Array 
(
    [945] => member Object 
     (
      [id] => 13317 
      [name] => Test 999 
      [last_name] => Test 999 
     ) 

    [54] => member Object 
     (
      [id] => 13316 
      [name] => Manuel 
      [last_name] => Maria parra 
     ) 

    [654] => member Object 
     (
      [id] => 13315 
      [name] => Byron 
      [last_name] => Castillo 
     ) 

    [656] => member Object 
     (
      [id] => 13314 
      [name] => Cesar 
      [last_name] => Vasquez 
     ) 
) 

muszę usunąć jeden z tych obiektów zgodnie z wartością atrybutu.
Na przykład, chcę usunąć z tablicy identyfikator obiektu 13316.

Odpowiedz

68

Oto podejście funkcjonalne:

$neededObjects = array_filter(
    $objects, 
    function ($e) { 
     return $e->id != 13316; 
    } 
); 
+19

Ktoś w dół głosował na piękny "array_filter"? * sadface * – erisco

+3

Jak skromny z was –

+8

dude tablica jest pierwszym parametrem array_filter, nie ostatnim! http://php.net/manual/en/function.array-filter.php –

0
foreach ($array as $key=>$value) 
     if ($value->id==13316) { 
     unset($array[$key]); 
     break; 
     } 
+0

Dziękuję za odpowiedź, mam edytowane moją odpowiedź, moje klucze nie są klasyfikowane, to znaczy, że nie są 0, 1, 2, 3 .. Proszę, popatrz na mojego awnsera, zmieniłem klucze tablicy, thk! –

+0

Powyższy kod będzie działał nawet przy zmianie. – stillstanding

4
function filter_by_key($array, $member, $value) { 
    $filtered = array(); 
    foreach($array as $k => $v) { 
     if($v->$member != $value) 
     $filtered[$k] = $v; 
    } 
    return $filtered; 
} 

$array = ... 
$array = filter_by_key($array, 'id', 13316); 
+1

Jeśli przedefiniujesz swoją funkcję w kategoriach 'array_filter', to zdobędziesz moje prawo głosu: D Być może' filter_by_key' będzie lepszą nazwą. – erisco

+0

@erisco, Co jest nie tak z 'filter_by_member'? –

+0

@erisco, Niezależnie od tego, zmieniłem go na "filter_by_key" zgodnie z zaleceniami. –

3

Ponieważ istnieje już mnóstwo rozwiązań podane, sugeruję alternatywa dla korzystania z macierzy:

$storage = new SplObjectStorage; // create an Object Collection 
$storage->attach($memberObject); // add an object to it 
$storage->detach($memberObject); // remove that object 

Można zrobić do niestandardowej klasy MemberCollection z metodami Findera i innymi operacjami narzędziowymi, np.

class MemberCollection implements IteratorAggregate 
{ 
    protected $_storage; 
    public function __construct() 
    { 
     $this->_storage = new SplObjectStorage; 
    } 
    public function getIterator() 
    { 
     return $this->_storage; 
    } 
    public function addMember(IMember $member) 
    { 
     $this->_storage->attach($member); 
    } 
    public function removeMember(IMember $member) 
    { 
     $this->_storage->detach($member); 
    } 
    public function removeBy($property, $value) 
    { 
     foreach ($this->_storage as $member) { 
      if($member->$property === $value) { 
       $this->_storage->detach($member); 
      } 
     } 
    }   
} 

Może to być jednak przesada w Waszym scenariuszu.

2

Użyj funkcji wyszukiwania tablica:

//return array index of searched item 

$key = array_search($search_value, array_column($list, 'column_name')); 

$list[key]; //return array item 
Powiązane problemy