티스토리 뷰

반응형

echo '<pre>';
print_r($box_data);
echo '</pre>';


위의 결과가 아래와 같다.

Array
(
    [0] => Array
        (
            [size] => 500*380
            [sum] => 1
            [cover] => 5
            [fincover] => 2
            [boxdirection] => 밑면
            [boxfrontbottom] => 50
            [boxrailwidth] => 70
            [length] => Array
                (
                    [0] => Array
                        (
                            [length] => 1219
                            [sum] => 1
                        )

                    [1] => Array
                        (
                            [length] => 2438
                            [sum] => 0
                        )

                    [2] => Array
                        (
                            [length] => 3000
                            [sum] => 0
                        )

                    [3] => Array
                        (
                            [length] => 3500
                            [sum] => 0
                        )

                    [4] => Array
                        (
                            [length] => 4000
                            [sum] => 0
                        )

                    [5] => Array
                        (
                            [length] => 4150
                            [sum] => 1
                        )

                )

        )

    [1] => Array
        (
            [size] => 500*350
            [sum] => 1
            [cover] => 6
            [fincover] => 2
            [boxdirection] => 후면
            [boxfrontbottom] => 50
            [boxrailwidth] => 70
            [length] => Array
                (
                    [0] => Array
                        (
                            [length] => 1219
                            [sum] => 0
                        )

                    [1] => Array
                        (
                            [length] => 2438
                            [sum] => 1
                        )

                    [2] => Array
                        (
                            [length] => 3000
                            [sum] => 0
                        )

                    [3] => Array
                        (
                            [length] => 3500
                            [sum] => 0
                        )

                    [4] => Array
                        (
                            [length] => 4000
                            [sum] => 1
                        )

                    [5] => Array
                        (
                            [length] => 4150
                            [sum] => 0
                        )

                )

        )

    [2] => Array
        (
            [size] => 550*450
            [sum] => 1
            [cover] => 6
            [fincover] => 2
            [boxdirection] => 양면
            [boxfrontbottom] => 50
            [boxrailwidth] => 70
            [length] => Array
                (
                    [0] => Array
                        (
                            [length] => 1219
                            [sum] => 0
                        )

                    [1] => Array
                        (
                            [length] => 2438
                            [sum] => 0
                        )

                    [2] => Array
                        (
                            [length] => 3000
                            [sum] => 0
                        )

                    [3] => Array
                        (
                            [length] => 3500
                            [sum] => 1
                        )

                    [4] => Array
                        (
                            [length] => 4000
                            [sum] => 1
                        )

                    [5] => Array
                        (
                            [length] => 4150
                            [sum] => 0
                        )

                )

        )

)

위의 결과에서 length의 sum이 0인 것은 제거하고 값이 있는 것만 남기려면?

length 배열에서 sum 값이 0인 항목을 제거하고, 값이 있는 항목만 유지하려면 array_filter를 사용할 수 있습니다. 아래는 해당 데이터를 처리하는 방법입니다.


수정된 코드

// length에서 sum이 0인 항목 제거
foreach ($box_data as $key => &$box) {
    $box['length'] = array_filter($box['length'], function ($lengthItem) {
        return $lengthItem['sum'] > 0; // sum 값이 0보다 큰 항목만 유지
    });
}

// 결과 출력
echo '<pre>';
print_r($box_data);
echo '</pre>';

주요 변경점

  1. array_filter로 sum이 0인 항목 제거:
    • array_filter는 배열의 각 항목에 대해 조건을 확인하고, 조건을 만족하는 항목만 반환합니다.
    • return $lengthItem['sum'] > 0;는 sum이 0보다 큰 항목만 남기도록 합니다.
  2. 참조 사용:
    • foreach ($box_data as $key => &$box)에서 &$box를 사용해 참조로 배열을 수정합니다.

수정 후 출력 결과

수정 후, length 배열에서 sum 값이 0인 항목이 제거됩니다. 예를 들어:

Array
(
    [0] => Array
        (
            [size] => 500*380
            [sum] => 1
            [cover] => 5
            [fincover] => 2
            [boxdirection] => 밑면
            [boxfrontbottom] => 50
            [boxrailwidth] => 70
            [length] => Array
                (
                    [0] => Array
                        (
                            [length] => 1219
                            [sum] => 1
                        )

                    [5] => Array
                        (
                            [length] => 4150
                            [sum] => 1
                        )

                )

        )

    [1] => Array
        (
            [size] => 500*350
            [sum] => 1
            [cover] => 6
            [fincover] => 2
            [boxdirection] => 후면
            [boxfrontbottom] => 50
            [boxrailwidth] => 70
            [length] => Array
                (
                    [1] => Array
                        (
                            [length] => 2438
                            [sum] => 1
                        )

                    [4] => Array
                        (
                            [length] => 4000
                            [sum] => 1
                        )

                )

        )

    [2] => Array
        (
            [size] => 550*450
            [sum] => 1
            [cover] => 6
            [fincover] => 2
            [boxdirection] => 양면
            [boxfrontbottom] => 50
            [boxrailwidth] => 70
            [length] => Array
                (
                    [3] => Array
                        (
                            [length] => 3500
                            [sum] => 1
                        )

                    [4] => Array
                        (
                            [length] => 4000
                            [sum] => 1
                        )

                )

        )

)

결과 요약

  • sum 값이 0인 항목이 length 배열에서 제거되었습니다.
  • array_filter는 효율적이며, 데이터가 깔끔하게 정리되었습니다.

 

PHP 배열에서 조건에 따라 항목 제거하기: array_filter 활용법

PHP로 데이터를 처리하다 보면, 배열의 특정 조건에 맞지 않는 항목을 제거하고 싶을 때가 있습니다. 예를 들어, 셔터 박스 데이터에서 길이별 개수를 저장한 배열에서 개수가 0인 데이터를 제거하고 싶다고 해봅시다.

이번 글에서는 array_filter를 사용하여 이런 작업을 간단하게 처리하는 방법을 초보자도 이해하기 쉽게 설명하겠습니다.


문제 상황

초기 데이터 구조

아래와 같은 배열이 있다고 가정해봅시다. 각 박스 크기(size)마다 길이(length)별 개수가 저장되어 있습니다.

$box_data = [
    [
        'size' => '500*380',
        'length' => [
            ['length' => '1219', 'sum' => 1],
            ['length' => '2438', 'sum' => 0],
            ['length' => '3000', 'sum' => 0],
            ['length' => '3500', 'sum' => 0],
            ['length' => '4000', 'sum' => 0],
            ['length' => '4150', 'sum' => 1],
        ]
    ],
    [
        'size' => '500*350',
        'length' => [
            ['length' => '1219', 'sum' => 0],
            ['length' => '2438', 'sum' => 1],
            ['length' => '3000', 'sum' => 0],
            ['length' => '3500', 'sum' => 0],
            ['length' => '4000', 'sum' => 1],
            ['length' => '4150', 'sum' => 0],
        ]
    ]
];

여기서 sum 값이 0인 항목은 의미가 없으므로 제거하고 싶습니다. 최종적으로 length 배열에 sum이 0이 아닌 항목만 남기려 합니다.


해결 방법: array_filter 사용

PHP의 array_filter 함수는 배열의 각 항목에 대해 조건을 검사하고, 조건을 만족하는 항목만 새로운 배열로 반환합니다. 이를 사용하면 조건에 따라 배열의 데이터를 깔끔하게 정리할 수 있습니다.


코드 작성

아래 코드를 작성해봅시다.

Step 1: array_filter를 사용해 sum 값이 0인 항목 제거하기

foreach ($box_data as $key => &$box) {
    // length 배열에서 sum이 0인 항목 제거
    $box['length'] = array_filter($box['length'], function ($lengthItem) {
        return $lengthItem['sum'] > 0; // sum 값이 0보다 큰 항목만 유지
    });
}
  • &$box: 배열을 참조로 가져옵니다. 이렇게 하면 원본 데이터를 직접 수정할 수 있습니다.
  • array_filter: length 배열의 각 항목에 대해 조건을 검사합니다.
  • 익명 함수: sum 값이 0보다 큰 항목만 남기도록 조건을 설정합니다.

Step 2: 결과 출력

결과를 확인하기 위해 print_r로 배열을 출력해봅시다.

echo '<pre>';
print_r($box_data);
echo '</pre>';

실행 결과

sum 값이 0인 항목이 제거된 결과는 아래와 같습니다.

Array
(
    [0] => Array
        (
            [size] => 500*380
            [length] => Array
                (
                    [0] => Array
                        (
                            [length] => 1219
                            [sum] => 1
                        )

                    [5] => Array
                        (
                            [length] => 4150
                            [sum] => 1
                        )
                )
        )
    [1] => Array
        (
            [size] => 500*350
            [length] => Array
                (
                    [1] => Array
                        (
                            [length] => 2438
                            [sum] => 1
                        )

                    [4] => Array
                        (
                            [length] => 4000
                            [sum] => 1
                        )
                )
        )
)

초보자도 이해할 수 있는 array_filter 작동 원리

  1. 배열 항목 반복
    array_filter는 배열의 각 항목을 하나씩 가져옵니다.
  2. 조건 확인
    익명 함수(function ($lengthItem) { return $lengthItem['sum'] > 0; })에서 sum 값이 0보다 큰지 확인합니다.
  3. 조건을 만족하는 항목만 반환
    sum 값이 0보다 큰 항목만 결과 배열에 포함됩니다.

코드 전체 보기

아래는 최종 코드입니다.

<?php
foreach ($box_data as $key => &$box) {
    // length 배열에서 sum이 0인 항목 제거
    $box['length'] = array_filter($box['length'], function ($lengthItem) {
        return $lengthItem['sum'] > 0; // sum 값이 0보다 큰 항목만 유지
    });
}

// 결과 출력
echo '<pre>';
print_r($box_data);
echo '</pre>';
?>

마무리

이제 length 배열에서 sum 값이 0인 항목을 제거할 수 있습니다. 이 방법은 데이터 정리에 매우 유용하며, 조건에 따라 데이터를 필터링해야 하는 다양한 상황에서 활용할 수 있습니다.

array_filter는 PHP에서 데이터를 다룰 때 가장 유용한 함수 중 하나입니다. 이 글을 통해 array_filter의 기본적인 사용법과 배열 데이터를 효율적으로 정리하는 방법을 이해하셨길 바랍니다. 😊


추가 팁: 더 복잡한 조건이 필요하다면?

만약 더 복잡한 조건을 추가하고 싶다면, 익명 함수 안에 논리를 더 작성하면 됩니다. 예를 들어, sum 값이 5 이상인 항목만 남기고 싶다면:

return $lengthItem['sum'] >= 5;

이렇게 조건을 바꿔주기만 하면 됩니다! 🎉

반응형
댓글