2011-10-08 17 views
8

Tôi cần xóa các mục trống trên các mảng đa cấp. Bây giờ tôi có thể loại bỏ các mục với các mảng con trống, nhưng không trống mảng ... nhầm lẫn, do đó, tôi ... Tôi nghĩ rằng mã sẽ giúp giải thích tốt hơn ...PHP - Làm thế nào để loại bỏ các mục rỗng của một mảng đệ quy?

<?php 

/** 
* 
* This function remove empty entries on arrays 
* @param array $array 
*/ 
function removeEmptysFromArray($array) { 

    $filtered = array_filter($array, 'removeEmptyItems'); 
    return $filtered; 
} 

/** 
* 
* This is a Callback function to use in array_filter() 
* @param array $item 
*/ 
function removeEmptyItems($item) { 

    if (is_array($item)) { 
     return array_filter($item, 'removeEmptyItems'); 
    } 

    if (!empty($item)) { 
     return true; 
    } 
} 


$raw = array(
    'firstname' => 'Foo', 
    'lastname' => 'Bar', 
    'nickname' => '', 
    'birthdate' => array( 
     'day' => '', 
     'month' => '', 
     'year' => '', 
    ), 
    'likes' => array(
     'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 
     'bikes' => array(), 
    ), 
); 

print_r(removeEmptysFromArray($raw)); 

?> 

Ok, mã này sẽ xóa "biệt hiệu", "ngày sinh" nhưng không xóa "xe đạp" có mảng trống.

Câu hỏi của tôi là ... Cách xóa mục nhập "xe đạp"?

Best Regards,

Xin lỗi vì tiếng anh của tôi ...

+0

Tại sao bạn muốn xóa chúng? – John

Trả lời

24

Hãy thử mã này:

<?php 
function array_remove_empty($haystack) 
{ 
    foreach ($haystack as $key => $value) { 
     if (is_array($value)) { 
      $haystack[$key] = array_remove_empty($haystack[$key]); 
     } 

     if (empty($haystack[$key])) { 
      unset($haystack[$key]); 
     } 
    } 

    return $haystack; 
} 

$raw = array(
    'firstname' => 'Foo', 
    'lastname' => 'Bar', 
    'nickname' => '', 
    'birthdate' => array(
     'day' => '', 
     'month' => '', 
     'year' => '', 
    ), 
    'likes' => array(
     'cars' => array('Subaru Impreza WRX STi', 'Mitsubishi Evo', 'Nissan GTR'), 
     'bikes' => array(), 
    ), 
); 

print_r(array_remove_empty($raw)); 
+0

Tuyệt, nó đang hoạt động! Cảm ơn đã giúp đỡ. –

+2

Cảm ơn, chỉ cần sử dụng nó. Một bổ sung: nếu bạn muốn loại bỏ các chuỗi "whitespaced" trong các giá trị mảng, sau đó thêm một mệnh đề "elseif" nhỏ: if (is_array ($ value)) { $ haystack [$ key] = array_remove_empty ($ haystack [$ Chìa khóa]); } elseif (is_string ($ haystack [$ key])) { $ haystack [$ key] = cắt ($ value); } mảng cách đó (mảng ("", ")) cũng sẽ được trả lại dưới dạng trống. –

+0

Luôn sử dụng \ _ \ _ FUNCTION__ trong các cuộc gọi đệ quy để làm cho chức năng của bạn được di động. –

-2

Nếu bạn muốn array_filter để làm việc một cách đệ quy, bạn sẽ cần phải chắc chắn rằng các cuộc gọi tiếp theo có thể chỉnh sửa các mục lồng nhau sâu hơn của mảng. Ngắn: Bạn cần phải chuyển nó theo tham chiếu:

function removeEmptyItems(&$item) { 
    if (is_array($item) && $item) { 
     $item = array_filter(&$item, 'removeEmptyItems'); 
    } 

    return !!$item; 
} 
1

Tôi nghĩ điều này sẽ giải quyết được vấn đề của bạn.

$retArray =array_filter($array, arrayFilter); 

function arrayFilter($array) { 
    if(!empty($array)) { 
     return array_filter($array); 
    } 
} 
0

Đây là giải pháp của tôi, nó sẽ loại bỏ danh sách chính xác định các giá trị rỗng đệ quy:

/** 
* Remove elements from array by exact values list recursively 
* 
* @param array $haystack 
* @param array $values 
* 
* @return array 
*/ 
function array_remove_by_values(array $haystack, array $values) 
{ 
    foreach ($haystack as $key => $value) { 
     if (is_array($value)) { 
      $haystack[$key] = array_remove_by_values($haystack[$key], $values); 
     } 

     if (in_array($haystack[$key], $values, true)) { 
      unset($haystack[$key]); 
     } 
    } 

    return $haystack; 
} 

Bạn có thể sử dụng nó như thế này:

$clean = array_remove_by_values($raw, ['', null, []]); 

Note, nó loại bỏ phụ rỗng mảng nếu bạn vượt qua [] làm một trong các giá trị.