2011-10-08 23 views

Trả lời

0

Bạn có thể sử dụng chức năng array_walk như đã thảo luận ở đây (3 câu trả lời xuống): is it possible if callback in array_filter receive parameter?

+0

Quá phức tạp và tôi đang làm việc với các mảng được lập chỉ mục chứ không phải mảng liên kết. Trong các khóa giải pháp đó được mã hóa cứng. – gremo

+1

Có lẽ một tiêu chuẩn 'code'foreach ($ arr như $ key => $ val) {} thực hiện sẽ phục vụ nhu cầu của bạn. – jondbaker

+0

Tôi cần phải lọc mảng đầu vào: nếu khóa tồn tại trong mảng khác thì trả về phần tử. Tôi tìm thấy 'array_filter' các ứng cử viên nhưng tôi không thể nhận được chìa khóa của giá trị mảng hiện tại trong gọi lại. – gremo

7

Trong một bình luận trước đó bạn nêu bạn đang thực sự tìm kiếm một cái gì đó như thế này:

foreach ($t as $k => $v) 
    if (!array_key_exists($k, $valid)) 
     unset($t[$k]) 

Vì vậy, trên thực tế để xóa tất cả các giá trị khỏi mảng $t không có khóa trong mảng $valid.

Hàm PHP được gọi là array_intersect_key. Ngã tư tương đương với kết quả lọc:

$filtered = array_intersect_key($t, $valid); 
3

Không có cách nào để cho các callback của array_filter truy cập chính của phần tử, cũng không phải là có một chức năng tương tự mà những gì bạn muốn.

Tuy nhiên, bạn có thể viết chức năng của riêng bạn cho điều này, như hình dưới đây:

function arrayfilter(array $array, callable $callback = null) { 
    if ($callback == null) { 
     $callback = function($key, $val) { 
      return (bool) $val; 
     }; 
    } 
    $return = array(); 
    foreach ($array as $key => $val) { 
     if ($callback($key, $val)) { 
      $return[$key] = $val; 
     } 
    } 
    return $return; 
} 

$test_array = array('foo', 'a' => 'the a', 'b' => 'the b', 11 => 1101, '', null, false, 0); 

$array = arrayfilter($test_array, function($key, $val) { 
    return is_string($key); 
}); 
print_r($array); 
/* 
Array 
(
    [a] => the a 
    [b] => the b 
) 
*/ 

$array = arrayfilter($test_array); 
print_r($array); 
/* 
Array 
(
    [0] => foo 
    [a] => the a 
    [b] => the b 
    [11] => 1101 
) 
*/ 
0

Tôi không thích các tùy chọn khác đề xuất ở đây, nếu có ai khác đang tìm kiếm tính năng này, đây là một triển khai nhanh chóng:

function array_filter_keys($a, $c){ 
    $i=array_filter(array_keys($a), $c); 
    return array_intersect_key($a, array_flip($i)); 
} 

Kết quả của hàm này chính xác như nó sẽ trả về mảng được lọc bởi hàm gọi lại nhận khóa thay vì giá trị.

CHỈNH SỬA: Điều này càng bị từ chối, sau khi đọc một số nhận xét khác tôi nhận thấy OP thực sự chỉ tìm kiếm array_intersect như hakre đã chỉ ra. Tôi sẽ để lại câu trả lời này đây mặc dù kể từ khi câu hỏi Ops không nêu rõ nhu cầu đó và trang này xuất hiện trong google cho array_filter_keys

9

Từ các tài liệu: PHP 5.6.0 thêm tham số tùy chọn cờ và hằng ARRAY_FILTER_USE_KEY và ARRAY_FILTER_USE_BOTH

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