>백엔드 개발 >PHP 튜토리얼 >키를 보존하면서 연관 배열의 데카르트 곱을 생성하는 방법은 무엇입니까?

키를 보존하면서 연관 배열의 데카르트 곱을 생성하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-25 10:39:11715검색

How to Generate the Cartesian Product of an Associative Array While Preserving Keys?

연관 배열의 키를 유지하면서 데카르트 곱 찾기

다음과 같은 연관 배열을 고려하세요.

$input = array(
    'arm' => array('A', 'B', 'C'),
    'gender' => array('Female', 'Male'),
    'location' => array('Vancouver', 'Calgary'),
);

목표는 원본을 보존하면서 이 배열의 데카르트 곱을 찾는 것입니다. 연관 키. 원하는 출력은 다음과 같습니다.

array(
    [0] => array(
        'arm' => 'A',
        'gender' => 'Female',
        'location' => 'Vancouver'
    ),
    [1] => array(
        'arm' => 'A',
        'gender' => 'Female',
        'location' => 'Calgary'
    ),
    [2] => array(
        'arm' => 'A',
        'gender' => 'Male',
        'location' => 'Vancouver'
    ),
    ...
)

알고리즘 원리

입력 배열에 N개의 하위 배열($input)이 있고 각각 Cn 항목이 있다고 가정합니다. 여기서 n은 그 색인입니다. n번째 하위 배열의 i번째 항목은 Vn,i라고 합니다.

알고리즘은 귀납법으로 증명합니다(버그가 없다고 가정).

  1. N = 1인 경우 데카르트 곱은 단순한 1D 배열입니다.
  2. 결과가 이미 다음의 데카르트 곱을 보유하고 있다고 가정합니다. 첫 번째 N-1 하위 배열인 경우 다음과 같이 확장할 수 있습니다.

    • KN 추가 => 현재 결과의 각 항목에 VN,1.
    • N번째 입력 하위 배열(2 을 사용하여 항목의 복사본을 추가합니다. ; VN,m.

코드 구현

function cartesian($input) {
    $result = array();

    while (list($key, $values) = each($input)) {
        if (empty($values)) {
            continue;
        }

        if (empty($result)) {
            foreach ($values as $value) {
                $result[] = array($key => $value);
            }
        } else {
            $append = array();

            foreach ($result as &$product) {
                $product[$key] = array_shift($values);
                $copy = $product;

                foreach ($values as $item) {
                    $copy[$key] = $item;
                    $append[] = $copy;
                }

                array_unshift($values, $product[$key]);
            }

            $result = array_merge($result, $append);
        }
    }

    return $result;
}

사용

$output = cartesian($input);
print_r($output);

이 코드는 원본을 유지하면서 원하는 데카르트 곱을 출력합니다. 연관 키.

위 내용은 키를 보존하면서 연관 배열의 데카르트 곱을 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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