2012-04-18 80 views
10

Tôi đã tìm kiếm rất nhiều câu trả lời, nhưng không ai trong số họ đang làm việc cho tôi.Làm thế nào để loại bỏ các giá trị rỗng từ mảng đa chiều trong PHP?

Đây là dữ liệu được gán cho mảng $quantities tôi:

Array(
    [10] => Array([25.00] => 1) 
    [9] => Array([30.00] => 3) 
    [8] => Array([30.00] => 4) 
    [12] => Array([35.00] =>) 
    [1] => Array([30.00] =>) 
    [2] => Array([30.00] =>) 
) 

Tôi đang tìm kiếm một cách để loại bỏ các subarrays với các giá trị rỗng như [12][1][2] trong khi vẫn giữ tất cả mọi thứ khác.

Kết quả mong muốn:

Array(
    [10] => Array([25.00] => 1) 
    [9] => Array([30.00] => 3) 
    [8] => Array([30.00] => 4) 
) 

tôi đã cố gắng rất nhiều các chức năng trên các tài liệu php chính thức và không ai trong số họ làm việc.

Tôi đã sử dụng này một:

function array_filter_recursive($array, $callback = null) { 
    foreach ($array as $key => & $value) { 
     if (is_array($value)) { 
      $value = array_filter_recursive($value, $callback); 
     } else { 
      if (! is_null($callback)) { 
       if (! $callback($value)) { 
        unset($array[$key]); 
       } 
      } else { 
       if (! (bool) $value) { 
        unset($array[$key]); 
       } 
      } 
     } 
    } 
    unset($value); 
    return $array; 
} 

Nhưng nó chỉ loại bỏ các phần tử trong subarrays; Tôi cần các subarrays được loại bỏ hoàn toàn.

Tôi không muốn điều này:

Array(
    [10] => Array([25.00] => 1) 
    [9] => Array([30.00] => 3) 
    [8] => Array([30.00] => 4) 
    [12] => Array() 
    [1] => Array() 
    [2] => Array() 
) 
+0

Cân nhắc sử dụng var_dump() để hiển thị cho chúng tôi nội dung mảng. –

+0

Đối với một trang được sử dụng làm đích đến cho nhiều liên kết song công, trang này có một số lượng lớn các câu trả lời không chính xác được upvoted. @ Richard-MX Tôi đã đăng câu trả lời không sử dụng đệ quy hoặc nhiều chức năng lặp lại để người đọc được quản lý ở đây có thể thấy giải pháp làm việc gọn gàng (không an toàn). (nó không rõ ràng trong bài viết của bạn nếu mảng trống của bạn có chuỗi rỗng hoặc 'null' làm giá trị, vì vậy tôi demo'ed với cả hai) – mickmackusa

Trả lời

12

Chậm, nhưng có thể giúp ai đó tìm kiếm cùng một câu trả lời. Tôi đã sử dụng cách tiếp cận rất đơn giản này;

  1. loại bỏ tất cả các phím từ mảng lồng nhau có chứa không có giá trị, sau đó
  2. loại bỏ tất cả các mảng lồng trống.

$postArr = array_map('array_filter', $postArr); 
$postArr = array_filter($postArr); 
2

Không chắc nếu điều này là chính xác những gì bạn đang tìm kiếm.

function array_remove_null($array) { 
    foreach ($array as $key => $value) 
    { 
     if(is_null($value)) 
      unset($array[$key]); 
     if(is_array($value)) 
      $array[$key] = array_remove_null($value); 
    } 
    return $array; 
} 

Cập nhật (điều chỉnh):

function array_remove_null($array) { 
    foreach ($array as $key => $value) 
    { 
     if(is_null($value)) 
      unset($array[$key]); 
     if(is_string($value) && empty($value)) 
      unset($array[$key]); 
     if(is_array($value)) 
      $array[$key] = array_remove_null($value); 
     if(isset($array[$key]) && count($array[$key])==0) 
      unset($array[$key]); 
    } 
    return $array; 
} 

Tôi chắc chắn kiểm tra tốt hơn và làm cho này mạnh mẽ hơn có thể giúp giải pháp.

+0

Xin chào Jason, cảm ơn bạn đã trả lời của bạn. Thật không may, nó không hoạt động cho những gì tôi cần.Khi Paul trả lời, nó trả về giống như câu hỏi ban đầu. –

+0

Tôi không chắc chắn tại sao điều này có 4 upvotes. Câu trả lời chỉ mã này không hoạt động. [Demo] (http://sandbox.onlinephpfunctions.com/code/a06f86d99043713158cb6170b516ffebd9533f4a) – mickmackusa

+0

@mickmackusa ví dụ này đã hoạt động trở lại trong ngày của PHP 5. –

1

sử dụng array_map() cho bộ lọc mỗi mảng trong $ mảng:

$newArray = array_map('array_filter', $array); 

Dưới đây là demo

+0

Câu trả lời này KHÔNG LÀM VIỆC. Nó không hoạt động trong liên kết demo đã đăng. Nó không hoạt động trong [liên kết demo của tôi] (http://sandbox.onlinephpfunctions.com/code/e8b7659f6b504afea691451351c039de24c0a7f4) Làm thế nào trên thế giới này kiếm được 3 upvotes? Downvote từ tôi. – mickmackusa

1
$newArray = array_map('array_filter', $array); 

sintax này đó là công việc và rất giúp chàng trai đầy đủ cảm ơn của ..

+0

Đây là một phương pháp trùng lặp chính xác (ký tự cho nhân vật) của câu trả lời của NaitikShah đã được đăng hai tháng trước đó. Nếu bạn không thể cải thiện câu trả lời của bạn để cung cấp thông tin tốt hơn, bạn nên xóa câu trả lời này bởi vì nó không thêm giá trị cho trang (nó chỉ là trang sưng lên). – mickmackusa

+0

Câu trả lời này KHÔNG LÀM VIỆC. Nó không hoạt động trong [liên kết demo của tôi] (http://sandbox.onlinephpfunctions.com/code/e8b7659f6b504afea691451351c039de24c0a7f4) Làm thế nào trên thế giới này kiếm được 3 upvotes? Downvote từ tôi. – mickmackusa

5

Chức năng sau hoạt động cho trường hợp của tôi.Chúng ta có thể sử dụng một hàm đệ quy đơn giản để loại bỏ tất cả các yếu tố có sản phẩm nào từ mảng PHP đa chiều:

function array_filter_recursive($input){ 
    foreach ($input as &$value){ 
     if (is_array($value)){ 
      $value = array_filter_recursive($value); 
     } 
    } 
    return array_filter($input); 
} 

Sau đó, chúng ta chỉ cần gọi hàm này:

$myArray = array_filter_recursive($myArray); 
1

Sử dụng array_filter với array_map như dưới đây:

$arr=array_filter(array_map('array_filter', $arr)); 
+0

Đây không phải là thông tin mới. Đây là một bản sao của câu trả lời của [AlastairF] (https://stackoverflow.com/a/18796083/2943403) được viết dưới dạng một lớp lót. – mickmackusa

-1

Thao tác này sẽ xóa tất cả các mục có giá trị rỗng theo cách đệ quy trên các mảng đa phương thức. Hoạt động trên PHP> = 5.6. Nếu bạn muốn xóa tất cả các giá trị "empry", hãy thay thế !is_null($value) bằng !empty($value).

function recursivelyRemoveItemsWithNullValuesFromArray(array $data = []): array 
{ 
    $data = array_map(function($value) { 
     return is_array($value) ? recursivelyRemoveItemsWithNullValuesFromArray($value) : $value; 
    }, $data); 

    return array_filter($data, function($value) { 
     return !is_null($value); 
    }); 
} 
+0

Câu trả lời này không cung cấp kết quả mong muốn của OP. [Demo] (http://sandbox.onlinephpfunctions.com/code/c30daafe3cf0959e0a0c4dcaa901244605a8f7d9) – mickmackusa

-2

Vì các mảng con trong mảng của bạn chỉ có một phần tử, bạn có thể đơn giản hóa phương pháp này bằng một trong hai phương pháp sau. Lợi thế lôgic là tránh biến lặp chức năng (array_filter) trên các phần tử mức thứ hai. Đây là lý do tại sao current() phù hợp hơn cho câu hỏi/trang này.

Code: (Demo)

$quantities=[ 
    10=>['25.00'=>1], 
    9=>['30.00'=>3], 
    8=>['30.00'=>4], 
    12=>['35.00'=>null], 
    1=>['30.00'=>''], 
    2=>['30.00'=>null] 
]; 

var_export(array_filter($quantities,function($a){return strlen(current($a));})); 

HOẶC

foreach($quantities as $key=>$sub){ // could be done "by reference" but that impacts code stability 
    if(!strlen(current($sub))){ // if subarray value has no length 
     unset($quantities[$key]); 
    } 
} 
var_export($quantities); 

Cả hai đầu ra cùng một kết quả (mà cố tình loại bỏ các giá trị rỗng và giữ gìn 0 giá trị)

array (
    10 => 
    array (
    '25.00' => 1, 
), 
    9 => 
    array (
    '30.00' => 3, 
), 
    8 => 
    array (
    '30.00' => 4, 
), 
) 

Ở phía trên phương pháp, strlen() được sử dụng để kiểm tra thứ e Yếu tố cấp 2 bởi vì OP chỉ liệt kê các số nguyên là các giá trị "không trống". Tương lai SO độc giả có thể có những yêu cầu khác nhau dựa trên các yếu tố có thể giữ false, null, '0', 0, vv chức năng thay thế Thích hợp cho strlen() có thể là: bất kỳ the "is_" functions, empty(), bất kỳ the "ctype" functions, và nhiều hơn nữa.

Nếu mảng thứ hai của OP chứa nhiều hơn một phần tử và OP muốn xóa tất cả các phần tử zero-ish, false-y, empty, null (nghĩa là số 0 không được mong muốn hoặc đảm bảo không xảy ra), thì Alastair F's answer sẽ là sự lựa chọn tốt nhất.

Nếu mảng đầu vào của OP có số lượng không xác định và các phần tử zero-ish/false-y/empty/null cần được loại bỏ, thì Reza Mamun's answer là một cách tiếp cận logic, đệ quy. Quan điểm của tôi là (và động lực của tôi sau khi dành quá nhiều thời gian và chăm sóc để trả lời câu hỏi này) rằng array_filter() là tham lam và nếu bạn không biết hành vi mặc định này, dự án của bạn có thể âm thầm xuất ra thông tin không chính xác. Tôi hy vọng lời giải thích này sẽ giúp các lập trình viên mất thời gian và xung đột.

Các vấn đề liên quan