2010-11-12 29 views
22

我有一個對象陣列是這樣的:查找陣列密鑰給定的屬性值

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 
     ) 
) 

我需要刪除根據屬性值這些對象中的一個。
例如,我想從數組中刪除的對象ID 13316.

回答

68

這裏是功能的方法:

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

有人倒了一個美麗的'array_filter'? * sadface * – erisco 2010-11-12 16:04:58

+3

你是多麼謙虛 – 2012-09-16 21:25:31

+8

花花公子是第一個array_filter參數,而不是最後一個! http://php.net/manual/en/function.array-filter.php – 2012-12-03 09:15:01

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

謝謝您的回答,我已經編輯我的回答,我的鑰匙不排序,我的意思是,他們不是0,1,2,3 .. 。請重新看看我的awnser,我更改了數組鍵,thk! – 2010-11-12 15:45:54

+0

以上代碼即使在您的更改後仍然可以使用。 – stillstanding 2010-11-12 15:54:48

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

如果你用'array_filter'來重新定義你的函數,你將贏得我的最後一票:D也許'filter_by_key'會是一個更好的名字。 – erisco 2010-11-12 16:08:09

+0

@erisco,'filter_by_member'有什麼問題? – 2010-11-12 16:09:03

+0

@erisco,無論我如何推薦,都將其更改爲「filter_by_key」。 – 2010-11-12 16:10:06

3

既然已經有給予足夠的解決方案,我建議使用該陣列的替代方案:

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

您可以mak使用Finder方法和其他實用操作將其轉換爲自定義MemberCollection類,例如,

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

雖然您的方案可能會過度殺傷。

2

使用陣列搜索功能:

//return array index of searched item 

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

$list[key]; //return array item