2012-06-14 39 views
32

Tôi có một mảng dữ liệu liên kết và tôi có một dãy các khóa mà tôi muốn xóa khỏi mảng đó (trong khi vẫn giữ các khóa còn lại theo thứ tự ban đầu - không phải là điều này có thể là một ràng buộc).Xóa các khóa danh sách đen khỏi mảng trong PHP

Tôi đang tìm kiếm một lớp lót của php để thực hiện việc này.
Tôi đã biết cách tôi có thể lặp qua các mảng nhưng có vẻ như cần có một số array_map với giải pháp unset hoặc array_filter ngay bên ngoài tầm nhìn của tôi.

Tôi đã tìm kiếm xung quanh một chút nhưng không tìm thấy gì ngắn gọn.

Để được rõ ràng đây là vấn đề làm trong một dòng:

//have this example associative array of data 
$data = array(
    'blue' => 43, 
    'red' => 87, 
    'purple' => 130, 
    'green' => 12, 
    'yellow' => 31 
); 

//and this array of keys to remove 
$bad_keys = array(
    'purple', 
    'yellow' 
); 

//some one liner here and then $data will only have the keys blue, red, green 
+0

Tạo chức năng để thực hiện: 'remove_keys_from_array ($ array, $ keys)'. Và nhìn vào đó, nó chỉ chiếm một dòng! – Blender

+0

Tôi biết nhưng tôi đặt cược có một số cách để sử dụng các chức năng php để làm điều đó ... nhưng công bằng đủ, nó chỉ mất một dòng – hackartist

Trả lời

87

$out =array_diff_key($data,array_flip($bad_keys));

Tất cả tôi đã làm là xem xét thông qua danh sách các Array functions cho đến khi tôi tìm thấy cái tôi cần (_diff_key).

+2

ok các mảng array_flip là những gì tôi không biết về. Cảm ơn! – hackartist

+1

Tôi đã phải suy nghĩ về điều này cho một mo. Điểm là '$ bad_keys = array (0 => 'purple', 1 => 'yellow')' do đó các khóa trong mảng_flip là 'purple', 'yellow'. Do đó diff_key hoạt động. Khéo léo. Cảm ơn Kolink. – TerryE

+0

Tôi một lần cần thiết để loại bỏ bởi giá trị (không phải chìa khóa) và tôi đã kết thúc với điều này: '$ myArr = mảng (5, 25, 5, 30);' ... THEN ... '$ myArr = & array_diff_key ($ myArr, array_flip (mảng_keys ($ myArr, 5))); ' – Stphane

14

Giải pháp thực sự là the one provided by Niet the Dark Absol. Tôi muốn cung cấp một giải pháp tương tự cho bất cứ ai là sau khi điều tương tự, nhưng lần này sử dụng một whitelist thay vì một danh sách đen:

$whitelist = array('good_key1', 'good_key2', ...); 
$output = array_intersect_key($data, array_flip($whitelist)); 

Mà sẽ gìn giữ chìa khóa từ $whitelist mảng và loại bỏ phần còn lại.

0

Đây là một chức năng danh sách cấm mà tôi đã tạo cho các mảng kết hợp.

if(!function_exists('array_blacklist_assoc')){ 

    /** 
    * Returns an array containing all the entries from array1 whose keys are not present in any of the other arrays when using their values as keys. 
    * @param array $array1 The array to compare from 
    * @param array $array2 The array to compare against 
    * @return array $array2,... More arrays to compare against 
    */ 

    function array_blacklist_assoc(Array $array1, Array $array2) { 
     if(func_num_args() > 2){ 
      $args = func_get_args(); 
      array_shift($args); 
      $array2 = call_user_func_array('array_merge', $args); 
     } 
     return array_diff_key($array1, array_flip($array2)); 
    } 
} 

$sanitized_data = array_blacklist_assoc($data, $bad_keys); 
Các vấn đề liên quan