목차
제품 옵션 트리 구조를 이해하십시오
질문 : 플랫 데이터에서 옵션 트리를 작성하십시오
솔루션 : 반복 구조 및 기준 횡단
1. 보조 매핑 구조를 준비하십시오
2. 옵션 트리를 반복적으로 빌드하십시오
완전한 샘플 코드
메모 및 요약
백엔드 개발 PHP 튜토리얼 제품 옵션 트리 : 플랫 데이터에서 중첩 구조로 동적으로 구축

제품 옵션 트리 : 플랫 데이터에서 중첩 구조로 동적으로 구축

Oct 07, 2025 pm 01:45 PM

제품 옵션 트리 : 평평한 데이터에서 중첩 구조로 동적으로 구축

이 튜토리얼은 평평한 제품 변형 선택 목록을 중첩 옵션 트리 구조로 변환하는 방법에 대해 자세히 설명합니다. PHP 예제를 통해 보조 매핑 및 기준 트래버살을 사용하여 다층 배열을 동적으로 빌드하는 방법을 보여줍니다. 여기서 각 레벨은 제품 옵션을 나타내고 최종 리프 노드는 해당 제품 ID를 저장하여 복잡한 제품 구성을 효율적으로 관리하고 표시합니다.

제품 옵션 트리 구조를 이해하십시오

전자 상거래 또는 제품 구성 시스템에서 제품은 종종 색상, 크기, 브랜드 등과 같은 다양한 선택적 변형을 가지고 있으며 이러한 변형 조합과 최종 제품 간의 관계를 효율적으로 표현하기 위해 옵션 트리 구조를 사용하는 것이 일반적입니다.

일반적인 옵션 트리는 깊이가 제품 옵션 수에 해당하는 다층 중첩 어레이입니다. 예를 들어, 제품에 색상, 크기 및 브랜드의 세 가지 옵션이있는 경우 옵션 트리의 깊이는 세 가지 레이어입니다. 트리의 각 레벨은 특정 옵션을 나타냅니다 (예 : 첫 번째 레이어는 색상이고, 두 번째 레이어는 크기이고, 세 번째 레이어는 브랜드), 배열의 인덱스는 옵션의 특정 값에 해당합니다. 트리의 가장 낮은 수준으로 반복하면 결국 모든 선택 조합과 일치하는 제품 ID가 나타납니다. 나무의 0 또는 널 값은 일반적으로 경로 아래에 해당 제품, 즉 "막 다른"이라는 것을 의미합니다.

샘플 옵션 트리 구조 :

 "옵션 트리": [
        [의 뜻
            0, // 해당 색상 : 빨간색, 크기 : 작은, 브랜드 : (없음)
            0, // 해당 색상 : 빨간색, 크기 : 매체, 브랜드 : (없음)
            [의 뜻
                820, // 해당 색상 : 빨간색, 크기 : 큰, 브랜드 : Brandx
                0 // 해당 색상 : 빨간색, 크기 : 큰, 브랜드 : 브랜디 (없음)
            ]]
        ],,
        [의 뜻
            0, // 해당 색상 : 녹색, 크기 : 작은, 브랜드 : (없음)
            [의 뜻
                0, // 해당 색상 : 녹색, 크기 : 중간, 브랜드 : Brandx (없음)
                821 // 해당 색상 : 녹색, 크기 : 중간, 브랜드 : 브랜디
            ],,
            [의 뜻
                823, // 해당 색상 : 녹색, 크기 : 큰, 브랜드 : Brandx
                0 // 해당 색상 : 녹색, 크기 : 큰, 브랜드 : 브랜디 (없음)
            ]]
        ],,
        [의 뜻
            [의 뜻
                824, // 해당 색상 : 파란색, 크기 : 작은, 브랜드 : Brandx
                825 // 해당 색상 : 파란색, 크기 : 작은, 브랜드 : 브랜디
            ],,
            0, // 해당 색상 : 파란색, 크기 : 중간, 브랜드 : (없음)
            0 // 해당 색상 : 파란색, 크기 : 큰, 브랜드 : (없음)
        ]]
    ]]

이 예에서, 가장 바깥 쪽 어레이의 인덱스는 다른 색상을 나타낼 수 있습니다 (예 : 인덱스 0은 빨간색을 나타내고 색인 1은 녹색을 나타내고 색인 2는 파란색을 나타냅니다). 두 번째 레이어 어레이의 인덱스는 크기를 나타냅니다 (예 : 색인 0은 작은 것을 나타내고, 인덱스 1은 매체를 나타내고, 인덱스 2는 큰) 등을 나타냅니다. 최종 번호 (예 : 820)는 특정 조합에 해당하는 제품 ID입니다.

질문 : 플랫 데이터에서 옵션 트리를 작성하십시오

선택 조합 (예 : 색상, 크기, 브랜드) 및 해당 제품 ID를 포함하는 플랫 제품 목록이 있다고 가정합니다.

 $ products_to_add = [
    [의 뜻
        "선택"=> [ '빨간색', 'medium', 'brandx'],
        "product_id"=> 820
    ],,
    [의 뜻
        "선택"=> [ '빨간색', '작은', '브랜디'],
        "product_id"=> 821
    ],,
    [의 뜻
        "선택"=> [ '녹색', '작은', 'Brandx'],
        "product_id"=> 822
    ],,
    [의 뜻
        "선택"=> [ 'blue', 'large', 'brandy'],
        "product_id"=> 823
    ],,
];

우리의 목표는이 플랫 목록을 위에서 설명한 중첩 "옵션 트리"구조로 변환하는 것입니다.

솔루션 : 반복 구조 및 기준 횡단

옵션 트리를 구축하는 열쇠는 옵션 값을 배열의 숫자 색인에 문자열 형식 (예 : "빨간색")으로 매핑하는 방법과 각 제품을 통해 반복되는 트리의 해당 분기를 동적으로 생성하거나 채우는 방법입니다.

1. 보조 매핑 구조를 준비하십시오

먼저, 특정 옵션 이름을 배열의 인덱스로 변환하려면 각 옵션 유형 (색, 크기, 브랜드)에 대한 맵을 만들어야합니다. 이는 Key-Value 배열 쌍을 교환하는 Array_flip 함수를 통해 쉽게 달성 할 수 있습니다.

 // 가능한 모든 옵션과 해당 순서 정의 $ all_colors = [ "빨간색", "녹색", "파란색"];
$ all_sizes = [ "small", "medium", "large"];
$ all_brands = [ "Brandx", "Brandy"];

// 보조 맵 생성 : 옵션 이름 => 배열 인덱스 $ props = [
    Array_flip ($ all_colors), // 색상 옵션 맵 array_flip ($ all_sizes), // 크기 옵션 맵 array_flip ($ all_brands) // 브랜드 옵션의 맵];

$ props 배열에는 이제 각 옵션 레벨에 대한 이름을 인덱싱하는 이름이 포함되어 있습니다. 예를 들어, $ props [0] [ 'Red']는 0이고 $ props [1] [ 'medium']가 반환됩니다.

2. 옵션 트리를 반복적으로 빌드하십시오

다음으로, 우리는 각 제품을 $ products_to_add로 반복하고 정보를 $ 옵션 트리에 삽입합니다. 여기서 PHP의 참조 (= &) 기능을 사용하는 핵심은 배열 내부의 요소에 대한 포인터를 만들 수 있으므로 트리를 가로 지르고 건축 할 때 해당 위치를 직접 수정할 수 있다는 것입니다.

 $ 옵션 트리 = null; // 빈 옵션 tree foreach ($ products_to_add) {{
    $ node = & $ 옵션 트리; // $ 옵션 트리에 대한 참조로 $ node 초기화 // 현재 제품의 각 선택 foreach ($ product [ "선택"] as $ depth => $ name) {
        // 현재 노드가 NULL 인 경우, 이것은 새 분기이며 null로 채워진 배열로 초기화되어야한다는 것을 의미합니다. // 배열의 크기는 ($ node === null)이면 현재 레벨의 가능한 모든 옵션의 수에 따라 다릅니다.
            $ node = array_fill (0, count ($ props [$ depth]), null);
        }

        // 옵션 이름 $ index = $ props [$ depth] [$ name]을 기반으로 현재 계층 구조 배열에서 인덱스를 가져옵니다.

        // $ node의 참조를 트리의 다음 레벨로 옮깁니다. $ node = & $ node [$ index];
    }

    // 모든 선택을 통과 한 후 현재 $ 노드는 최종 리프 노드 위치를 가리 킵니다. // 제품 ID를이 위치에 할당 $ node = $ product [ "product_id"];
}

// unset 방지에 대한 회의가 없습니다 ($ node);

코드 설명 :

  • $ 옵션 트리 = null; : 초기에 전체 옵션 트리가 비어 있습니다.
  • $ node = & $ 옵션 트리; : $ 노드는 새 제품이 처리 될 때마다 전체 $ 옵션 트리에 대한 참조로 설정됩니다. 즉, $ 노드에 대한 모든 수정은 $ 옵션 트리에 직접 반영됩니다.
  • foreach ($ product [ "선택"] as $ depth => $ name) :이 루프는 현재 제품의 모든 선택을 통과합니다. $ 깊이는 현재 어떤 옵션을 선택했는지를 나타냅니다 (예 : 0은 색상을 나타내고 1은 크기를 나타냅니다), $ 이름은 특정 선택 값 (예 : "빨간색")입니다.
  • if ($ node === null) : 이것은 핵심 단계입니다. 현재 $ 노드를 가리키는 경우 (즉,이 분기 경로가 처음으로 액세스되는 경우) 현재 레벨에서 옵션을 수용 할 수있는 새 배열을 만들어야합니다. array_fill (0, count ($ props [$ depth]), NULL)는 지정된 크기의 배열 (총 현재 옵션 레벨 수에 따라 결정 됨)을 생성하고 NULL을 채 웁니다.
  • $ index = $ props [$ 깊이] [$ name]; : 이전에 준비된 $ props 맵을 사용하여 현재 옵션 이름 (예 : "Red")을 해당 배열 인덱스로 변환합니다.
  • $ node = & $ node [$ index]; : 이것은 참조 트래버스의 핵심입니다. $ 노드에 대한 참조는 현재 계층 구조 배열의 해당 인덱스 위치를 가리 키도록 업데이트됩니다. 이런 식으로 다음 루프에서 $ 노드는 트리의 더 깊은 층을 가리 킵니다.
  • $ node = $ product [ "product_id"]; : 내부 루프가 끝나면 $ 노드는 현재 제품의 모든 선택 조합과 정확히 일치하는 옵션 트리의 리프 노드 위치를 가리 킵니다. 현재 제품의 Product_id를이 위치에 할당합니다.
  • Unset ($ node); : 이것은 좋은 프로그래밍 습관입니다. 참조가 사용 된 후 Dereference는 $ Node가 실수로 후속 코드에서 $ 옵션 트리를 수정하는 것을 방지 할 수 있습니다.

완전한 샘플 코드

코드의 위 두 부분을 결합하면 완전한 솔루션을 얻을 수 있습니다.

  php

// 1. 가능한 모든 옵션과 해당 순서를 정의합니다 $ all_colors = [ "Red", "Green", "Blue"];
$ all_sizes = [ "small", "medium", "large"];
$ all_brands = [ "Brandx", "Brandy"];

// 2. 보조 맵 생성 : 옵션 이름 => 배열 인덱스 $ props = [
    Array_flip ($ all_colors), // 색상 옵션 맵 array_flip ($ all_sizes), // 크기 옵션 맵 array_flip ($ all_brands) // 브랜드 옵션의 맵];

// 3. 보류중인 플랫 제품 데이터 $ products_to_add = [
    [의 뜻
        "선택"=> [ '빨간색', 'medium', 'brandx'],
        "product_id"=> 820
    ],,
    [의 뜻
        "선택"=> [ '빨간색', '작은', '브랜디'],
        "product_id"=> 821
    ],,
    [의 뜻
        "선택"=> [ '녹색', '작은', 'Brandx'],
        "product_id"=> 822
    ],,
    [의 뜻
        "선택"=> [ 'blue', 'large', 'brandy'],
        "product_id"=> 823
    ],,
];

// 4. 빈 옵션 트리를 초기화하십시오 $ 옵션 트리 = null;

// 5. 반복적으로 옵션 트리 foreach ($ products_to_add로 $ product) {{
    $ node = & $ 옵션 트리; // $ 옵션 트리에 대한 참조로 $ node 초기화 // 현재 제품의 각 선택 foreach ($ product [ "선택"] as $ depth => $ name) {
        // 현재 노드가 NULL 인 경우, 이것은 새 분기이며 null로 채워진 배열로 초기화되어야한다는 것을 의미합니다. // 배열의 크기는 ($ node === null)이면 현재 레벨의 가능한 모든 옵션의 수에 따라 다릅니다.
            // 부적절한 구성으로 인한 오류를 피하기 위해 $ props [$ depth]가 있는지 확인하십시오.
                새로운 예외를 던지십시오 ( "옵션 깊이에 대한 구성 누락 :". $ 깊이);
            }
            $ node = array_fill (0, count ($ props [$ depth]), null);
        }

        // 옵션 이름이지도에 존재하는지 확인 if (! isset ($ props [$ propth] [$ name])) {
            // 비즈니스 로직 에코 "경고 : 옵션 '{$ name}'깊이 {$ depth}. $ product [ "product_id"]. "\N";
            // $ 노드를 null로 설정하고 내부 루프 $ node = null을 깨는 등이 상황을 처리하는 방법을 고려하십시오. 
            부서지다; // 현재 제품 선택주기에서 벗어나}

        // 옵션 이름 $ index = $ props [$ depth] [$ name]을 기반으로 현재 계층 구조 배열에서 인덱스를 가져옵니다.

        // $ node의 참조를 트리의 다음 레벨로 옮깁니다. $ node = & $ node [$ index];
    }

    // if ($ node! == null)를 할당합니다.
        // 모든 선택을 통과 한 후 현재 $ 노드는 최종 리프 노드 위치를 가리 킵니다. // 제품 ID를이 위치에 할당 $ node = $ product [ "product_id"];
    }
}

// 6. 실수로 수정되지 않은 ($ 노드)를 방지하기위한 피로;

// 7. 생성 된 옵션 트리 echo ""를 출력합니다.
print_r ($ 옵션 트리);
echo "
"; ?>

출력 결과 (부분적으로, 가독성을 위해 단순화) :

 정렬
(
    [0] => 배열 // 해당 색상 : 빨간색
        (
            [0] => 배열 // 해당 크기 : 작은
                (
                    [0] => null
                    [1] => 821 // 브랜드 : 브랜디
                ))

            [1] => 배열 // 해당 크기 : 중간
                (
                    [0] => 820 // 브랜드 : Brandx
                    [1] => null
                ))

            [2] => null // 해당 크기 : 대형 (일치하는 제품 없음)
        ))

    [1] => 배열 // 해당 색상 : 녹색
        (
            [0] => 배열 // 해당 크기 : 작은
                (
                    [0] => 822 // 브랜드 : Brandx
                    [1] => null
                ))
            // ... 기타 녹색 관련 옵션)
    // ... 기타 청색 관련 옵션)

메모 및 요약

  1. 인용의 중요성 (&) : PHP의 인용 이해는이 동적 빌드 방법을 구현하는 핵심입니다. 이를 통해 사본을 만드는 대신 $ 옵션 트리의 내부 구조를 직접 조작 할 수 있습니다. 사용한 후에는 설정하지 마십시오 ($ Node).
  2. NULL 및 0 선택 : 옵션 트리에서 NULL과 0은 모두 "데드 엔드"또는 일치하는 제품을 나타낼 수 있습니다. NULL을 사용하는 것은 일반적으로 PHP에서 정의되지 않았거나 널 값인 변수의 의미와 일치하기 때문에 더 명확합니다.
  3. 옵션 순서의 수정 가능성 : array_flip은 원래 옵션 배열의 순서에 따라 다릅니다. 실제 애플리케이션에서 $ all_colors, $ all_size 등과 같은 배열 순서가 고정되어 있고 가능한 모든 옵션을 포함하는지 확인하십시오. 그렇지 않으면 인덱스 혼동이 발생하거나 해당 옵션을 찾을 수 없습니다.
  4. 가변 옵션 번호 : 이 방법을 사용하면 옵션 트리를 다른 깊이로 처리하는 데 유연성이 있습니다. $ props 배열이 모든 레벨에서 매핑으로 올바르게 구성되는 한, 옵션 수에 관계없이 코드가 올바르게 작동합니다.
  5. 오류 처리 : 실제 생산 환경에서는 $ props [$ 깊이] 및 $ props [$ depth] [$ name]을 확인하는 것이 제품 데이터에 예외를 던지거나 경고 기록과 같은 $ props에 정의되지 않은 옵션 값이 포함될 때 상황을 처리하도록 추가해야합니다.
  6. 성능 고려 사항 : 이 반복 시공 방법은 일반적으로 재귀의 오버 헤드를 피하기 때문에 매우 큰 제품 데이터 세트에 대해 더 효율적입니다. 그러나 옵션 수와 각 옵션의 값이 매우 큰 경우 Array_Fill은 메모리 소비에주의를 기울여 매우 큰 배열을 생성 할 수 있습니다.

위의 방법을 통해 평평한 제품 변형 선택 목록을 명확한 구조를 가진 중첩 옵션 트리로 효율적이고 동적으로 변환 할 수 있으며, 쿼리 및 관리가 용이하며 제품 구성 및 필터링 기능을위한 견고한 데이터 기반을 제공합니다.

위 내용은 제품 옵션 트리 : 플랫 데이터에서 중첩 구조로 동적으로 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT

Stock Market GPT

더 현명한 결정을 위한 AI 기반 투자 연구

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

PHP에서 이메일 주소가 유효한지 확인하는 방법은 무엇입니까? PHP에서 이메일 주소가 유효한지 확인하는 방법은 무엇입니까? Sep 21, 2025 am 04:07 AM

usefilter_var () tovalidateemailsyntaxandcheckdnsrr () toverifydomainmxrecords.example : $ email = "user@example.com"; if (f ilter_var ($ 이메일, filter_validate_email) && checkdnsrr (Explode ( '@', $ email) [1], 'mx')) {echo "validandDeliverableEmail & qu

PHP에서 물체를 딥 카피 나 복제하는 방법은 무엇입니까? PHP에서 물체를 딥 카피 나 복제하는 방법은 무엇입니까? Sep 21, 2025 am 12:30 AM

AseUnserialize (Serialize ($ obj))는 AllDataisserializable 이하의 경우 FordeepCopying; 그렇지 않으면, ubstract__clone () tomanuallyduplicateNestEdObjectSandavoidshartReferences.

PHP에서 두 배열을 병합하는 방법은 무엇입니까? PHP에서 두 배열을 병합하는 방법은 무엇입니까? Sep 21, 2025 am 12:26 AM

USEARRAY_MERGE () TOCOMBINEARRAYS, DUCRITINGDUPLICATESTRINGKEYSANDENTEXINGUMERICEYS; FORSIMPLERCONCATENATION, 특히 인포드 55.6, USETHESPLATOPERATOR [... $ array1, ... $ array2].

PHP 프로젝트에서 네임 스페이스를 사용하는 방법은 무엇입니까? PHP 프로젝트에서 네임 스페이스를 사용하는 방법은 무엇입니까? Sep 21, 2025 am 01:28 AM

네임 스페이스 인 네임 스페이스 inphorganizecodecodecodeandnamingnamingconflictsbygroupingclasses, 인터페이스, 함수, andconstantsOnspecificname.2.defineanamesUsUsingThenamesPaceyWordAtTHETOPOFOFILE, AFFORBINSPACENAME, suchATESKEYSTOI

PHP로 데이터베이스에서 레코드를 업데이트하는 방법은 무엇입니까? PHP로 데이터베이스에서 레코드를 업데이트하는 방법은 무엇입니까? Sep 21, 2025 am 04:47 AM

toupdateadaBasereCordInphp, FirstConnectusingpdoorMysqli, whenEseprepredStatementStoExecuteAcureCuresqlupDateQuery.example : $ pdo = newpdo ( "mysql : host = localhost; dbname = your_database", $ username, $ username, $ sql = "squer erestemail);

PHP의 마법 방법은 무엇이며`__call ()`및`__get ()`의 예를 제공합니다. PHP의 마법 방법은 무엇이며`__call ()`및`__get ()`의 예를 제공합니다. Sep 20, 2025 am 12:50 AM

The__call ()는 MethodsibleorundorundeRunded에서 정의 될 때 MethodStrigged를 정의하고, themodnameandarguments, asshowningwhendingderdefinedmethodslikesayhello ()

MySQL 조건부 응집 : 필드의 조건 합계 및 계산을 구현하기위한 사용 사례 명령문 MySQL 조건부 응집 : 필드의 조건 합계 및 계산을 구현하기위한 사용 사례 명령문 Sep 16, 2025 pm 02:39 PM

이 기사에서는 케이스 문을 사용하여 MySQL에서 조건부 집계를 수행하여 특정 필드의 조건부 합산 및 계산 방법에 대해 자세히 설명합니다. 실제 구독 시스템 사례를 통해 레코드 상태 (예 : "END"및 "CANCEL"과 같은 총 기간 및 이벤트 수를 동적으로 계산하여 복잡한 조건부 집계의 요구를 충족시킬 수없는 전통적인 합계 기능의 한계를 극복하는 방법을 보여줍니다. 튜토리얼은 합 함수로 사례 문의 적용을 자세히 분석하고 왼쪽 조인의 가능한 널 값을 다룰 때 Coalesce의 중요성을 강조합니다.

PHP에서 파일 확장을 얻는 방법은 무엇입니까? PHP에서 파일 확장을 얻는 방법은 무엇입니까? Sep 20, 2025 am 05:11 AM

useathinfo ($ filename, pathinfo_extension) togetThefileExtension; itreliablyHandleSmultipledOtsededGecases, returningTheextension (예 : "pdf") oranEmptyStringifnoneExists.

See all articles