2011-10-19 51 views
13

Tôi có một mảng đối tượng (hiển thị bên dưới) và tôi muốn viết một hàm trả về cùng một mảng nhưng với "đối tượng" đáp ứng tiêu chí đã loại bỏ.Làm cách nào để lọc một mảng đối tượng?

Chức năng sẽ:

1- kiểm tra nếu chỉ số tồn tại 2- nếu nó tồn tại, kiểm tra các giá trị cần thiết và nếu chỉ số của đối tượng là bằng giá trị đó, loại bỏ toàn bộ đối tượng.

Ví dụ:

Array 
(
    [course] => Array 
     (
      [0] => stdClass Object 
       (
        [name] => Programmation Web 
        [description] => 
        [public] => 0 
        [requests] => 0 
        [id] => 245 
        [members] => Array 
         (
          [0] => stdClass Object 
           (
            [id] => 11 
            [name] => Robert Smith 
           ) 

         ) 

        [projects] => Array 
         (
          [0] => stdClass Object 
           (
            [id] => 1923 
            [title] => Sans titre (1) 
            [type] => portfolio 
           ) 

          ) 

        [project_count] => 1 
        [admins] => Array 
         (
          [0] => stdClass Object 
           (
            [member] => 11 
            [firstname] => Robert 
            [lastname] => Smith 
           ) 

         ) 

        [topic_name] => Le PHP 
        [activites] => Array 
         (
          [0] => stdClass Object 
           (
            [topic_name] => 
            [topic_id] => 42 
            [post_parent] => 107 
            [post_body] => Oui moi aussi je me demande ça. 
            [post_id] => 109 
           ) 

         ) 

        [forums] => Array 
         (
          [0] => stdClass Object 
           (
            [forum_name] => Discussion générale 
            [forum_id] => 101 
           ) 

         ) 

       ) 

      [1] => stdClass Object 
       (
        [name] => Les bases de données 
        [description] => 
        [public] => 0 
        [jointype] => controlled 
        [grouptype] => course 
        [membershiptype] => admin 
        [topic_name] => Difficulté 
        [activites] => Array 
         (
          [0] => stdClass Object 
           (
            [topic_name] => 
            [topic_id] => 44 
            [post_parent] => 111 
            [post_body] => Ouah! 
            [post_id] => 112 
           ) 

         ) 

        [forums] => Array 
         (
          [0] => stdClass Object 
           (
            [forum_name] => Le MySQL 
            [forum_id] => 103 
           ) 

         ) 

       ) 

     ) 

) 

Nếu có một đối tượng mà admins-> thành viên giá trị tương đương với 11, loại bỏ các đối tượng và trả lại mảng mà không cần đối tượng này. Do đó, mảng được trả về sẽ là:

 Array 
(
    [course] => Array 
     (
      [0] => stdClass Object 
       (
        [name] => Programmation Web 
        [description] => 
        [public] => 0 
        [requests] => 0 
        [id] => 245 
        [members] => Array 
         (
          [0] => stdClass Object 
           (
            [id] => 11 
            [name] => Robert Smith (smithrobert) 
           ) 

         ) 

        [projects] => Array 
         (
          [0] => stdClass Object 
           (
            [id] => 1923 
            [title] => Sans titre (1) 
            [type] => portfolio 
           ) 

          ) 

        [project_count] => 1 
        [admins] => Array 
         (
          [0] => stdClass Object 
           (
            [member] => 11 
            [firstname] => Robert 
            [lastname] => Smith 
           ) 

         ) 

        [topic_name] => Le PHP 
        [activites] => Array 
         (
          [0] => stdClass Object 
           (
            [topic_name] => 
            [topic_id] => 42 
            [post_parent] => 107 
            [post_body] => Oui moi aussi je me demande ça. 
            [post_id] => 109 
           ) 

         ) 

        [forums] => Array 
         (
          [0] => stdClass Object 
           (
            [forum_name] => Discussion générale 
            [forum_id] => 101 
           ) 

         ) 

       ) 

     ) 

) 

Tôi sẽ làm như thế nào?

+0

Đã xem ['array_filter'] (http://php.net/array_filter). –

+0

Nhân bản (http://stackoverflow.com/questions/7814872/how-to-filter-out-an-object-from-an-array-of-objects) – SparrowG

Trả lời

29

Bạn muốn lọc một mảng? Sử dụng array_filter!

$new_array = array_filter($array, function($obj){ 
    if (isset($obj->admins)) { 
     foreach ($obj->admins as $admin) { 
      if ($admin->member == 11) return false; 
     } 
    } 
    return true; 
}); 
+0

Xin chào! Cảm ơn câu trả lời gọn gàng của bạn! Có vẻ như nó phải làm việc nhưng nó không hoạt động ... $ new_array chỉ giống như mảng $ sau khi tôi chuyển nó qua hàm gọi lại của bạn. – Alex

+0

Thực sự rất lạ, nó làm việc cho tôi. Và bằng cách nhìn vào cấu trúc dữ liệu của bạn, tôi không thể thấy tại sao nó sẽ không ...: S – netcoder

+0

Mảng bắt đầu với một "khóa học" chỉ mục, đó có thể là lý do tại sao nó không hoạt động? – Alex

3

Bạn có thể sử dụng array_filter với một callback tùy chỉnh:

function filter_callback($element) { 
    if (isset($element->foo) && $element->foo == 'some_value') { 
    return TRUE; 
    } 
    return FALSE; 
} 

$arr = array_filter($arr, 'filter_callback'); 
Các vấn đề liên quan