Идея алгоритма, чтобы найти все возможности, исключая членов массива?

1

Я буду использовать эту функцию в этом цикле:

while ($nbrDocument < 12 && $nbrTags > 0)
{
    $tmpDocuments = $this
        ->get('fos_elastica.manager')
        ->getRepository('AppBundle:Document')
        ->findFromTag();
    $tagPossibilities = $this->generateTagPossibilities($userTags, $nbrTags);
    foreach ($tmpDocuments as $document)
    {
        $present = true;
        foreach ($tagPossibilities as $tags)
        {
            foreach ($tags as $tag)
            {
                if (!in_array($tag, $document->getTag()))
                {
                    $present = false;
                    break;
                }
            }
            if ($present) {
                break;
            }
        }
        $nbrDocument ++;
        array_push($documents, $$document);
    }
    $nbrTags--;
}

И мне нужно создать метод generateTagPossibilities.

Первый параметр содержит массив строковых данных, а второй - размер возможностей, которые мне нужны.

Например, если у меня есть [1] [2] [3] [4] в моем массиве и $ nbrTag = 4, эта функция должна возвращать [1] [2] [3] [4], если $ nbrTag = 3, он должен вернуться [[1] [2] [3]] [[1] [3] [4]] [[2] [3] [4]]...

Понял, как я могу это сделать?

Теги:
algorithm

1 ответ

0

Вы можете использовать следующие функции:

function array_hash($a)
{
    $s = '';
    foreach($a as $v)
    {
        $s.=$v.'-';
    }

    return hash('sha256',$s);
}

function removeOne($setList)
{
    $returnSetList = array();
    $hashList = array();

    foreach($setList as $set)
    {
        foreach($set as $k=>$v)
        {
            $tmpSet = $set;
            unset($tmpSet[$k]);
            $hash = array_hash($tmpSet);

            if(!in_array($hash, $hashList))
            {
                $returnSetList[] = $tmpSet;
                $hashList[] = $hash;
            }
        }
    }

    return $returnSetList;
}

function generateTagPossibilities($userTags, $nbrTags)
{
    $aUserTags = array($userTags);
    $cUserTags = count($userTags);

    if($nbrTags==$cUserTags)
        return $aUserTags;

    for($i=0; $i<($cUserTags-$nbrTags); $i++)
        $aUserTags = removeOne($aUserTags);

    return $aUserTags;
}

// Example !

$a = array(1,2,3,4);
print_r(generateTagPossibilities($a,2));

/*

Array
(
    [0] => Array
        (
            [2] => 3
            [3] => 4
        )

    [1] => Array
        (
            [1] => 2
            [3] => 4
        )

    [2] => Array
        (
            [1] => 2
            [2] => 3
        )

    [3] => Array
        (
            [0] => 1
            [3] => 4
        )

    [4] => Array
        (
            [0] => 1
            [2] => 3
        )

    [5] => Array
        (
            [0] => 1
            [1] => 2
        )
)

*/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню