PHP 的陣列裡面,想要保留某些 Key,將其它的全部移除,要怎麼做呢?
- 註:想要重組 URL 的 Query string 時,很常使用到此功能。
PHP 陣列 想 保留某些特定值 其他全部移除
一個非常直覺的寫法,把不存在的全部 unset() 掉即可,寫法如下:
<?php function array_allow_keys($array, $allow) { if (!is_array($array) || !is_array($allow)) return false; foreach ($array as $k => $v) { if (!in_array($k, $allow)) unset($array[$k]); } return $array; } // USAGE: // $arr = ['c' => 3, 'sort' => 'id', 'b' => 2, 'tab' => 'home', 'a' => 1]; // $allowed = ['sort', 'tab']; // 要保留的 // print_r(array_allow_keys($arr, $allowed)); // array([sort] => id, [tab] => home) // or // array_allow_keys($GET, $allowed); // 直接把 $GET 要的過濾出來 ?>
想要重組 URL 的 Query String,可以使用下述 Function。
<?php function filter_query_string($query_string, $allowed = []) { if (empty($allowed)) return $query_string; $filtered = []; if (is_array($allowed) && count($allowed) > 0) { parse_str($query_string, $url_get); $filtered = array_allow_keys($url_get, $allowed); } return empty($filtered) ? $query_string : http_build_query($filtered); } // USAGE: // print_r(filter_query_string($_SERVER['QUERYSTRING'], $allowed = ['sort', 'tab'])); // print_r(filter_query_string('sort=id&c=3&b=2&tab=home&a=1', $allowed = ['sort', 'tab'])); // sort=id&tab=home ?>
要將 Array 的 Key 值過濾並保留,下述是使用 array_filter 的寫法:(註:使用上面的即可,下述寫法執行起來的速度比較慢一點)
下述寫法改寫自下述:
<?php function array_allow_keys($array, $allow) { if (!is_array($array) || !is_array($allow)) return false; return array_filter( $array, function ($key) use ($allow) { return in_array($key, $allow); }, ARRAY_FILTER_USE_KEY ); } ?>