2010-11-12 59 views
22

Tôi có một mảng đối tượng như thế này:Tìm chủ chốt mảng trong mảng đối tượng đưa ra một giá trị thuộc tính

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

tôi cần phải loại bỏ một trong các đối tượng này theo một giá trị thuộc tính.
Ví dụ, tôi muốn loại bỏ từ mảng các đối tượng id 13316.

Trả lời

68

Dưới đây là cách tiếp cận chức năng:

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

Một người nào đó đã bỏ phiếu cho một 'mảng_filter' đẹp? * sadface * – erisco

+3

Mức độ khiêm tốn của bạn –

+8

dude mảng là tham số array_filter đầu tiên, không phải là thông số cuối cùng! http://php.net/manual/en/function.array-filter.php –

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

Cảm ơn bạn đã trả lời của bạn, tôi đã chỉnh sửa câu trả lời của tôi, chìa khóa của tôi không được sắp xếp, ý tôi là, chúng không phải là 0, 1, 2, 3 .. hãy nhìn vào cái nhìn của tôi, tôi đã thay đổi các phím mảng, thk! –

+0

Mã trên sẽ vẫn hoạt động ngay cả với thay đổi của bạn. – 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

Nếu bạn xác định lại chức năng của mình dưới dạng 'mảng_filter' bạn sẽ kiếm được phiếu bầu của mình: D Có lẽ' filter_by_key' sẽ là một tên tốt hơn. – erisco

+0

@erisco, Có gì sai với 'filter_by_member'? –

+0

@erisco, Bất kể tôi đã thay đổi nó thành 'filter_by_key' như bạn đã đề xuất. –

3

Vì đã là giải pháp nhiều nhất định, tôi đề nghị thay thế cho việc sử dụng mảng:

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

Bạn có thể làm e vào lớp tùy chỉnh MemberCollection với các phương pháp tìm kiếm và các hoạt động tiện ích khác, ví dụ:

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

Có thể quá mức cần thiết cho kịch bản của bạn.

2

Sử dụng chức năng tìm kiếm mảng:

//return array index of searched item 

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

$list[key]; //return array item 
Các vấn đề liên quan