필터 시스템을 캐시하기 위해 여러 배열에서 가능한 모든 항목 선택을 PHP에서 생성하는 방법

줄스 콜레

필터 시스템을 만들었습니다. 여러 분류에 대한 결과를 필터링 할 수 있습니다.

예 : 게임 및 생산성 범주에 속하는 모든 뉴스 기사 및 비디오를 표시하고 태그 하드웨어를 사용하여 다음과 같이 선택할 수 있습니다.

Content Type
[x] news article
[x] video
[ ] opinion

Category
[x] gaming
[x] productivity
[ ] music

Tags
[x] hardware
[ ] software

이것은 다음과 같은 배열로 표현 될 수 있습니다.

[ [ 'news article', 'video' ], [ 'gaming', 'productivity' ], [ 'hardware' ] ];

이제 기본적으로 내가 원하는 것은 가능한 모든 조합을 포함하는 배열을 얻는 것입니다. 따라서 다음과 같이 시작됩니다.

[
  [ [], [], [], ], // no selections
  [ ['news article'], [], [], ], // only news article selected
  [ ['video'], [], [], ],
  [ ['opinion'], [], [], ],
  [ ['news article, video'], [], [], ],
  [ ['news article, opinion'], [], [], ],
  [ ['video, opinion'], [], [], ],
  [ ['news article'], ['gaming'], [], ],
  ...
  [ ['news article', 'video', 'opinion'], ['gaming', 'productivity', 'music'], ['hardware','software'], ],
];

이것은 충분히 일반적인 문제처럼 보이지만 지금까지 찾은 유일한 조합 알고리즘은 각 배열에서 하나의 요소로만 조합을 만드는 알고리즘입니다. 내가 만들고 싶은 조합 세트가 엄청나게 빨리 커질 것이라는 것을 알고 있지만 이와 같은 배열을 생성하는 데 사용할 수있는 알려진 접근 방식이나 PHP 함수가 있습니까?

사용자 14717238

먼저 다음 함수를 사용하여 가능한 모든 선택을 생성하십시오.

function array_combine_values($array)
{
    $len = count($array);
    $result = [];
    for($i = 0; $i < pow(2, $len); $i++) {
        $row = [];
        $indexes = str_split(str_pad(decbin($i), $len, '0', STR_PAD_LEFT));
        foreach($indexes as $key => $index) {
            if ($index) $row[] = $array[$key];
        }
        $result[] = $row;
    }
    return $result;
}

예:

print_r(array_combine_values(['a', 'b']));

산출:

Array
(
    [0] => Array
        (
        )
    [1] => Array
        (
            [0] => b
        )
    [2] => Array
        (
            [0] => a
        )
    [3] => Array
        (
            [0] => a
            [1] => b
        )
)

둘째, 배열의 데카르트 곱의 기능 :

function array_cartesian_product($array)
{
    if (empty($array)) return [[]];

    $column = array_shift($array);
    $cartesian = array_cartesian_product($array);

    $result = [];
    foreach ($column as $row) {
        foreach ($cartesian as $item) {
            array_unshift($item, $row);
            $result[] = $item;
        }
    }
    return $result;        
}

예:

print_r(array_cartesian_product([['a', 'b'], ['c', 'd']]));

산출:

Array
(
    [0] => Array
        (
            [0] => a
            [1] => c
        )
    [1] => Array
        (
            [0] => a
            [1] => d
        )
    [2] => Array
        (
            [0] => b
            [1] => c
        )
    [3] => Array
        (
            [0] => b
            [1] => d
        )
)

귀하의 경우에 사용 :

$selections = array( 
    ['news article', 'video', 'opinion'], 
    ['gaming', 'productivity', 'music'], 
    ['hardware','software']
);

$result = [];

foreach($selections as $items) {
    $result[] = array_combine_values($items);
}

$result = array_cartesian_product($result);

print_r($result);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관