필터 시스템을 만들었습니다. 여러 분류에 대한 결과를 필터링 할 수 있습니다.
예 : 게임 및 생산성 범주에 속하는 모든 뉴스 기사 및 비디오를 표시하고 태그 하드웨어를 사용하여 다음과 같이 선택할 수 있습니다.
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 함수가 있습니까?
먼저 다음 함수를 사용하여 가능한 모든 선택을 생성하십시오.
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] 삭제
몇 마디 만하겠습니다