2012-06-14 12 views
32

私はデータの連想配列を持っていますが、残りのキーは元の順序で保持していますが、その配列から削除したいキーの配列を持っています制約)。PHPの配列からブラックリストキーを削除する

私はこれを行うには、ライナーを1つ探していますこれは、
私はすでに配列をループする方法を知っていますが、array_mapunsetまたはarray_filterという解決策があるはずです。

私は少し調べましたが、それほど簡潔ではありませんでした。

は明確にするために、これは一行で行うことが問題である:

//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

'remove_keys_from_array($ array、$ keys)'関数を実行します。そしてそれを見て、それは1行だけを取ります! – Blender

+0

私は知っているが、PHP関数を使用する方法がいくつかあると思うが...公正​​だが、それは1行しかない。 – hackartist

答えて

87

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

私が見つけたまで私がしたすべては、Array functionsのリストを見ていました私が必要なもの(_diff_key)。

+2

ok array_flipのトリックは私が知らなかったものだ。ありがとう! – hackartist

+1

私はこのことについて一ヶ月間考える必要がありました。ポイントは '$ bad_keys = array(0 => 'purple'、1 => 'yellow')'なので、array_flipのキーは 'purple'、 'yellow'です。したがって、diff_keyは機能します。きちんとしたKolinkに感謝します。 – TerryE

+0

キーではなく値で削除する必要があったので、これで終わりました: '$ myArr = array(5、25、5、30);' ... THEN ... '$ myArr =&array_diff_key($ myArr、array_flip(array_keys($ myArr、5))); ' – Stphane

14

実際にはthe one provided by Niet the Dark Absolです。

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

$whitelist配列からキーを保持し、残りの部分を削除します:私は、同じようなことの後であるが、この1つは代わりにブラックリストホワイトリストを使用するすべてのユーザーのための別の同様のソリューションを提供したいと思います。

0

これは連想配列用に作成したブラックリスト機能です。

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); 
関連する問題