PHP: генерировать все возможные комбинации массива с некоторыми необходимыми элементами, а некоторые необязательными - PullRequest
1 голос
/ 08 марта 2012

У меня есть 2 массива. 1 с элементами, которые всегда должны использоваться, и 1 с дополнительными элементами. Что я хочу, так это список всех возможных комбинаций с этими предметами. Элементы в массиве должны стать атрибутами с истинным или ложным значением.

Например, массивы

$requiredAttr = array('header', 'footer');
$optAttr = array('image');

Должен дать следующий результат:

header="false" footer="false"
header="false" footer="false" image="false"
header="false" footer="false" image="true"
header="true" footer="false"
header="true" footer="false" image="false"
header="true" footer="false" image="true"
header="false" footer="true"
header="false" footer="true" image="false"
header="false" footer="true" image="true"
header="true" footer="true"
header="true" footer="true" image="false"
header="true" footer="true" image="true"

Конечно, это работает с любым количеством элементов в обоих массивах.

Ответы [ 3 ]

0 голосов
/ 08 марта 2012

проверьте это .. изменить имя переменной в соответствии с вашим стандартом .. я печатаю весь массив для отладки.

http://codepad.org/HK1plx9n

более оптимизированный код

http://codepad.org/pwVOWeRJ

<?php

$requiredAttr = array('header', 'footer');
$boolarr = array('true', 'false');
$optAttr = array('image' );

$larr  = combine_array($requiredAttr , $boolarr , '=');

$a_arr = array_slice($larr , 0 , count($larr)/2);
$b_arr = array_slice($larr , count($larr)/2 , count($larr)/2);


$larr_1    = combine_array($a_arr , $b_arr , ' ');
$larr     = combine_array($optAttr , $boolarr , '=');
array_push($larr , ''); // for optional

$larr_3  = combine_array($larr_1 , $larr , ' ');

function combine_array($first_arr , $second_arr , $separator)
{
    $combine_arr  = array();
    for($i=0;$i<count($first_arr) ; $i++)
    {
    for($j=0;$j<count($second_arr) ; $j++)
    {
        array_push($combine_arr , $first_arr[$i].$separator.$second_arr[$j]);
    } 
    }
    return $combine_arr;
}



print_r($larr_3);



?>
0 голосов
/ 08 марта 2012

отделите все необходимые от необязательных атрибутов и используйте для каждого набора этот гист . Когда вы создадите комбинаторику каждого набора, вы просто скопируете каждую комбинаторику из требуемого набора комбинаторики в этот массив и добавите каждый необязательный необязательный набор комбинаторики к каждому необходимому набору комбинаторики.

0 голосов
/ 08 марта 2012

Вероятно, вы можете реализовать это с помощью двоичного дерева, которое просто возвращает все его значения.Нечто подобное (только теоретическое, вероятно, не будет работать):

function a($bool_arr, $required, $optional)
{
    if (count($bool_arr) < (count($required) + count($optional))
    {
        return array_merge(a(array_merge($bool_arr), array(true), $required, $optional), a(array_merge($bool_arr), array(false), $required, $optional));
    }
}
...