PHP : array_filter ()를 사용하여 배열 키를 필터링하는 방법은 무엇입니까?
PHPPHP : array_filter ()를 사용하여 배열 키를 필터링하는 방법은 무엇입니까?
array_filter ()의 콜백 함수는 키가 아닌 배열의 값만 전달합니다.
만약 내가 가지고 있다면:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
$ my_array의 $ allowed 배열에없는 모든 키를 삭제하는 가장 좋은 방법은 무엇입니까?
원하는 출력 :
$my_array = array("foo" => 1);
해결법
-
==============================
1.PHP 5.6에서는 array_filter () 플래그에 세 번째 매개 변수 인 ARRAY_FILTER_USE_KEY를 설정하여 값 대신 키로 필터링 할 수 있습니다.
PHP 5.6에서는 array_filter () 플래그에 세 번째 매개 변수 인 ARRAY_FILTER_USE_KEY를 설정하여 값 대신 키로 필터링 할 수 있습니다.
$my_array = ['foo' => 1, 'hello' => 'world']; $allowed = ['foo', 'bar']; $filtered = array_filter( $my_array, function ($key) use ($allowed) { return in_array($key, $allowed); }, ARRAY_FILTER_USE_KEY );
분명히 이것은 array_intersect_key ($ my_array, array_flip ($ allowed))만큼 우아하지는 않지만 키에 대해 임의의 테스트를 수행 할 수있는 유연성을 추가로 제공합니다. 허용 된 $에는 일반 문자열 대신 정규식 패턴이 포함될 수 있습니다.
ARRAY_FILTER_USE_BOTH를 사용하여 필터 함수에 전달 된 값과 키를 모두 사용할 수도 있습니다. 여기에 첫 번째를 기반으로 한 고안된 예제가 있지만 다음과 같이 $를 사용하여 필터링 규칙을 인코딩하지 않는 것이 좋습니다.
$my_array = ['foo' => 1, 'bar' => 'baz', 'hello' => 'wld']; $allowed = ['foo' => true, 'bar' => true, 'hello' => 'world']; $filtered = array_filter( $my_array, function ($val, $key) use ($allowed) { // N.b. $val, $key not $key, $val return isset($allowed[$key]) && ( $allowed[$key] === true || $allowed[$key] === $val ); }, ARRAY_FILTER_USE_BOTH ); // ['foo' => 1, 'bar' => 'baz']
-
==============================
2.array_intersect_key 및 array_flip을 사용하여
array_intersect_key 및 array_flip을 사용하여
var_dump(array_intersect_key($my_array, array_flip($allowed))); array(1) { ["foo"]=> int(1) }
-
==============================
3.동일한 작업을 수행해야했지만 키에 대해 더 복잡한 array_filter를 사용했습니다.
동일한 작업을 수행해야했지만 키에 대해 더 복잡한 array_filter를 사용했습니다.
비슷한 방법을 사용하여 내가 한 일은 다음과 같습니다.
// Filter out array elements with keys shorter than 4 characters $a = array( 0 => "val 0", "one" => "val one", "two" => "val two", "three"=> "val three", "four" => "val four", "five" => "val five", "6" => "val 6" ); $f = array_filter(array_keys($a), function ($k){ return strlen($k)>=4; }); $b = array_intersect_key($a, array_flip($f)); print_r($b);
결과가 출력됩니다.
Array ( [three] => val three [four] => val four [five] => val five )
-
==============================
4.다음은 클로저를 사용하는보다 유연한 솔루션입니다.
다음은 클로저를 사용하는보다 유연한 솔루션입니다.
$my_array = array("foo" => 1, "hello" => "world"); $allowed = array("foo", "bar"); $result = array_flip(array_filter(array_flip($my_array), function ($key) use ($allowed) { return in_array($key, $allowed); })); var_dump($result);
출력 :
array(1) { 'foo' => int(1) }
따라서이 기능에서는 다른 특정 테스트를 수행 할 수 있습니다.
-
==============================
5.키에서 발생하는 문자열로 배열을 필터링하는 방법을 찾고 있다면 다음을 사용할 수 있습니다.
키에서 발생하는 문자열로 배열을 필터링하는 방법을 찾고 있다면 다음을 사용할 수 있습니다.
$mArray=array('foo'=>'bar','foo2'=>'bar2','fooToo'=>'bar3','baz'=>'nope'); $mSearch='foo'; $allowed=array_filter( array_keys($mArray), function($key) use ($mSearch){ return stristr($key,$mSearch); }); $mResult=array_intersect_key($mArray,array_flip($allowed));
print_r ($ mResult)의 결과는 다음과 같습니다.
Array ( [foo] => bar [foo2] => bar2 [fooToo] => bar3 )
정규 표현식을 지원하는이 대답의 변형
function array_preg_filter_keys($arr, $regexp) { $keys = array_keys($arr); $match = array_filter($keys, function($k) use($regexp) { return preg_match($regexp, $k) === 1; }); return array_intersect_key($arr, array_flip($match)); } $mArray = array('foo'=>'yes', 'foo2'=>'yes', 'FooToo'=>'yes', 'baz'=>'nope'); print_r(array_preg_filter_keys($mArray, "/^foo/i"));
산출
Array ( [foo] => yes [foo2] => yes [FooToo] => yes )
-
==============================
6.Maček의 문제에 대해 Vincent의 솔루션을 어떻게 사용하든 관계없이 실제로 array_filter를 사용하지는 않습니다. 검색 엔진에서 여기에 온 경우 아마 다음과 같은 것을 찾고있을 것입니다 (PHP> = 5.3).
Maček의 문제에 대해 Vincent의 솔루션을 어떻게 사용하든 관계없이 실제로 array_filter를 사용하지는 않습니다. 검색 엔진에서 여기에 온 경우 아마 다음과 같은 것을 찾고있을 것입니다 (PHP> = 5.3).
$array = ['apple' => 'red', 'pear' => 'green']; reset($array); // Unimportant here, but make sure your array is reset $apples = array_filter($array, function($color) use ($&array) { $key = key($array); next($array); // advance array pointer return key($array) === 'apple'; }
필터링중인 배열을 콜백에 대한 참조로 전달합니다. array_filter는 공용 내부 포인터를 늘림으로써 배열을 반복적으로 반복하지 않으므로 혼자서 진행해야합니다.
여기서 중요한 점은 어레이가 재설정되었는지 확인해야한다는 것입니다. 그렇지 않으면 어레이의 중간에서 바로 시작할 수 있습니다.
PHP> = 5.4에서는 콜백을 더 짧게 만들 수 있습니다.
$apples = array_filter($array, function($color) use ($&array) { return each($array)['key'] === 'apple'; }
-
==============================
7.unset ()을 사용하는 덜 유연한 대안은 다음과 같습니다.
unset ()을 사용하는 덜 유연한 대안은 다음과 같습니다.
$array = array( 1 => 'one', 2 => 'two', 3 => 'three' ); $disallowed = array(1,3); foreach($disallowed as $key){ unset($array[$key]); }
print_r ($ array)의 결과는 다음과 같습니다.
Array ( [2] => two )
필터 된 값을 나중에 사용할 수 있도록 유지하려는 경우에는 적용 할 수 없지만 확실하지 않은 경우에는보다 정돈 된 값을 유지해야합니다.
-
==============================
8.PHP 5.6부터 array_filter에서 ARRAY_FILTER_USE_KEY 플래그를 사용할 수 있습니다 :
PHP 5.6부터 array_filter에서 ARRAY_FILTER_USE_KEY 플래그를 사용할 수 있습니다 :
$result = array_filter($my_array, function ($k) use ($allowed) { return in_array($k, $allowed); }, ARRAY_FILTER_USE_KEY);
그렇지 않으면 TestDummy의이 함수를 사용할 수 있습니다.
function filter_array_keys(array $array, $callback) { $matchedKeys = array_filter(array_keys($array), $callback); return array_intersect_key($array, array_flip($matchedKeys)); } $result = filter_array_keys($my_array, function ($k) use ($allowed) { return in_array($k, $allowed); });
그리고 여기에 콜백을 받거나 직접 키를 받아들이는 확장 된 버전의 광산이 있습니다 :
function filter_array_keys(array $array, $keys) { if (is_callable($keys)) { $keys = array_filter(array_keys($array), $keys); } return array_intersect_key($array, array_flip($keys)); } // using a callback, like array_filter: $result = filter_array_keys($my_array, function ($k) use ($allowed) { return in_array($k, $allowed); }); // or, if you already have the keys: $result = filter_array_keys($my_array, $allowed));
마지막으로 중요한 것은 foreach를 사용하는 것입니다.
$result = []; foreach ($my_array as $key => $value) { if (in_array($key, $allowed)) { $result[$key] = $value; } }
-
==============================
9.어쩌면 과충전이 필요할 수도 있지만 YaLinqo 라이브러리 *를 사용하여 컬렉션을 필터링하고 다른 변형을 수행 할 수 있습니다. 이 라이브러리는 구문이 유창한 객체에 대해 SQL과 유사한 쿼리를 수행 할 수있게합니다. where 함수는 값과 키라는 두 개의 인수로 calback을 허용합니다. 예 :
어쩌면 과충전이 필요할 수도 있지만 YaLinqo 라이브러리 *를 사용하여 컬렉션을 필터링하고 다른 변형을 수행 할 수 있습니다. 이 라이브러리는 구문이 유창한 객체에 대해 SQL과 유사한 쿼리를 수행 할 수있게합니다. where 함수는 값과 키라는 두 개의 인수로 calback을 허용합니다. 예 :
$filtered = from($array) ->where(function ($v, $k) use ($allowed) { return in_array($k, $allowed); }) ->toArray();
(where 함수는 반복자를 반환하므로, 결과 시퀀스에서 foreach 만 반복하면 -> toArray ()를 제거 할 수 있습니다.)
* 나에 의해 개발 됨
-
==============================
10.이 함수를 사용하면 다차원 배열을 필터링 할 수 있습니다.
이 함수를 사용하면 다차원 배열을 필터링 할 수 있습니다.
function filter_array_keys($array,$filter_keys=array()){ $l=array(&$array); $c=1; //This first loop will loop until the count var is stable// for($r=0;$r<$c;$r++){ //This loop will loop thru the child element list// $keys = array_keys($l[$r]); for($z=0;$z<count($l[$r]);$z++){ $object = &$l[$r][$keys[$z]]; if(is_array($object)){ $i=0; $keys_on_array=array_keys($object); $object=array_filter($object,function($el) use(&$i,$keys_on_array,$filter_keys){ $key = $keys_on_array[$i]; $i++; if(in_array($key,$filter_keys) || is_int($key))return false; return true; }); } if(is_array($l[$r][$keys[$z]])){ $l[] = &$l[$r][$keys[$z]]; $c++; }//IF }//FOR }//FOR return $l[0]; }
-
==============================
11.PHP에서 배열 필터 함수 :
PHP에서 배열 필터 함수 :
array_filter ( $array, $callback_function, $flag )
$ array - 입력 배열입니다.
$ callback_function - 사용할 콜백 함수. 콜백 함수가 true를 반환하면 array의 현재 값이 결과 배열로 반환됩니다.
$ flag - 선택적 매개 변수이며 콜백 함수에 전달할 인수를 결정합니다. 이 매개 변수가 비어 있으면 콜백 함수는 배열 값을 인수로 취합니다. 인수로 배열 키를 보내려면 $ flag를 ARRAY_FILTER_USE_KEY로 사용하십시오. 키와 값을 모두 전송하려면 $ flag를 ARRAY_FILTER_USE_BOTH로 사용해야합니다.
예제 : 간단한 배열을 고려하십시오.
$array = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
배열 키를 기반으로 배열을 필터링하려면 배열 함수 array_filter의 세 번째 매개 변수로 ARRAY_FILTER_USE_KEY를 사용해야합니다.
$get_key_res = array_filter($array,"get_key",ARRAY_FILTER_USE_KEY );
배열 키와 배열 값을 기반으로 배열을 필터링하려면 배열 함수 array_filter의 세 번째 매개 변수로 ARRAY_FILTER_USE_BOTH를 사용해야합니다.
$get_both = array_filter($array,"get_both",ARRAY_FILTER_USE_BOTH );
샘플 콜백 함수 :
function get_key($key) { if($key == 'a') { return true; } else { return false; } } function get_both($val,$key) { if($key == 'a' && $val == 1) { return true; } else { return false; } }
출력됩니다.
Output of $get_key is :Array ( [a] => 1 ) Output of $get_both is :Array ( [a] => 1 )
-
==============================
12.// 4 문자보다 짧은 키를 가진 배열 요소를 필터링합니다. // Closure와 익명 함수를 사용하여 ...
// 4 문자보다 짧은 키를 가진 배열 요소를 필터링합니다. // Closure와 익명 함수를 사용하여 ...
function comparison($min) { return function($item) use ($min) { return strlen($item) >= $min; }; } $input = array( 0 => "val 0", "one" => "val one", "two" => "val two", "three"=> "val three", "four" => "val four", "five" => "val five", "6" => "val 6" );
$ 출력 = array_filter (array_keys ($ 입력), 비교 (4));
print_r ($ 출력);
-
==============================
13.
$elements_array = ['first', 'second'];
function remove($arr, $data) { return array_filter($arr, function ($element) use ($data) { return $element != $data; }); }
print_r(remove($elements_array, 'second'));
from https://stackoverflow.com/questions/4260086/php-how-to-use-array-filter-to-filter-array-keys by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
문자열에서 줄 바꾸기 (0) | 2018.09.14 |
---|---|
효율적인 JPEG 이미지 크기 조정 (0) | 2018.09.14 |
PHP를 사용하여 HTTP 헤더를 UTF-8로 설정 (0) | 2018.09.14 |
야, 내 PHP는 어디있어? (0) | 2018.09.14 |
PHP 프로젝트를위한 배포 / 빌드 / CI주기 설정 (0) | 2018.09.14 |