프로그래밍/Php

php array_map / array_walk / array_filter 의 차이점

소행성왕자 2018. 10. 16. 11:28

php array_map / array_walk / array_filter 의 차이점


array_map

배열의 각 요소에 대한 함수를 호출하는 foreach 루프로 생각하면 안됩니다.
배열의 각 요소에 독립적으로 함수를 적용하는 것으로 생각해야합니다.



array_walk

데이터 배열을 처리하는 것과 정확히 반대되는 방식입니다. 
별도로 각 항목을 처리하는 대신 상태 ( &$userdata )를 사용하여 항목을 편집 할 수 있습니다 (foreach 루프와 비슷 함).
항목에 $funcname 적용될 때마다 프로그램의 전역 상태가 변경 될 수 있으므로 항목을 올바르게 처리하는 한 가지 올바른 방법이 필요합니다.

아래 예제는 배열의 키와 값을 가져와서 기존배열을 변경하는 예제입니다.
기본배열의 값을 변경이 가능한 이유는 &$v  때문에 가능한거죠. 
주의: 배열의 값만 변경 될 수 있습니다. 그 구조는 변경 될 수 없습니다.


1
2
3
4
5
$arr = ['aa','bb','cc ','dd'];
array_walk($arr, function(&$v, $k) {
    $v = $k.' is key => '.$v.' is value';
});
print_r($arr);
cs


1
2
3
4
5
6
7
8
Array
(
    [0=> 0 is key => aa is value
    [1=> 1 is key => bb is value
    [2=> 2 is key => cc  is value
    [3=> 3 is key => dd is value
)
 
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 
$string ="16-OCT-2018 to 20-OCT-2018";
 
$first_array = explode("to"$string);
array_walk($first_arrayfunction(&$item) {
         $item = explode('-'$item);
});
 
print_r($first_array);
 
Array
(
    [0=> Array
        (
            [0=> 16
            [1=> OCT
            [2=> 2018 
        )
 
    [1=> Array
        (
            [0=>  20
            [1=> OCT
            [2=> 2018
        )
 
)
cs

array_filter

콜백 함수를 사용하여 배열 요소 필터링 한다라고 되어있는데
도대체 무슨 얘길 하는질 모르겠습니다.

다시 쉬운말로 풀이해보자면 배열긔 각 값을 반복하여 콜백함수에 전달하는데요
콜백함수가 true 일때만 현재값을 배열로 반환하는것입니다.
중요한건 배열의 키값은 보존이 됩니다.

예를 들어보겠습니다.

1
2
$arr = [0,1,2,33,'','text'];
print_r(array_filter($arr));
cs


위와값이 배열값이 있는데 아래결과를 보면 0(0번키)값과 ''(4번키) 값이 빠져있습니다.
생각하시는것이 맞습니다. 
0 이랑 '' 빈공백은 false 를 뜻하니 반환하지 않는거죠.
또한 키값은 원본 그대로 가져오게 됩니다.

1
2
3
4
5
6
7
Array
(
    [1=> 1
    [2=> 2
    [3=> 33
    [5=> text
)
cs



자 그럼 또다른 예제를 볼까요?
아래 소스는 배열에서 2 이상인것만 가져오고 싶은겁니다.

1
2
3
4
$arr = [0,1,2,33,'','text'];
print_r(array_filter($arr, function($val) {
    return $val >= 2;
}));
cs

결과는 아래와 같습니다.
배열의 키는 보존한채로 2 이상인 값만 반환된거죠.

1
2
3
4
5
Array
(
    [2=> 2
    [3=> 33
)
cs

array_filter 확실이 아셨나요?