0

我正在做一个个人项目来创建一个关键字生成工具。我已经设置了一个递归函数来循环遍历多维数组,以找出提供的关键字列表中的所有可能组合。

public function recurseful($start, $args)
{
if (is_array($args))
    {
        foreach ($args[0] as $value)
        {
            $this->output[] = trim("{$start} {$value}");
            if (count($args) > 1)
            {
                $this->recurseful($value, array_slice($args, 1));
            }
        }
    }
return;
}

我传入:

$data = array(
    array('New York', 'New York City'),
    array('hotel', 'lodging','motel'),
);

$results = recurseful('', $data);

它成功地迭代并为我提供了各种关键字组合的列表。但是,它将它们全部返回到一个$output数组中。该函数旨在从 $Data[0](或者更确切地说是 $args[0])中获取值,并将它们与给定的任何其他关键字匹配。

我宁愿他们回来

1st ('New York', 'New York City')
2nd ('New York hotel', 'New York lodging', 'New York motel')
3rd ('New York City hotel', 'New York City lodging', 'New York City motel')

它目前将所有这些匹配项返回为一个。我如何让他们去不同的阵列?由于第一个是 的精确匹配$data[0],这很容易获得,但是在遍历所有可能的组合以获取 中的一个值后,我将如何强制一个新数组$data[0]?(因此,如果 中有 3 个值$data[0],则会返回 3 个额外的数组)。

屏幕截图 用户将所需的单词选择输入到电子表格中。 初始输入

结果将与此类似。所以我想将每一列数据放入它自己的数组中。 预期产出 上面的当前解决方案只是将所有内容放入自己的数组中,因此将在同一列中返回。

var_dump

4

1 回答 1

0

经过同事的更多思考和帮助,我已经找到了一个可行的解决方案。

function permutate($data, $limit){
    $this->limit = $limit;
    $this->data = $data;
    $this->numLevels = count($this->data);

    $this->possiblePermutations = 1;
    foreach ($this->data as $array){
        $this->possiblePermutations *= count($array);
    }
    for ($i = 0; $i < $this->numLevels - 0; $i++){
        $this->permutations[$i] = array();
    }

    $this->recurse(0, 0, '');

    return $this->permutations;
}

private function recurse($currentLevel, $level, $string){
    if ($this->numPerms == $this->limit) 
        return;

    foreach ($this->data[$level] as $val){
        if ($this->numPerms == $this->limit) 
            return;

        $newString = "$string $val";
        if ($level == $currentLevel){
            $this->permutations[$level][] = trim($newString);
            $this->numPerms++;
        }

        if ($level < $this->numLevels - 1 AND $level <= $currentLevel){
            $this->recurse($currentLevel, $level + 1, $newString);
        }
    }

    if (! $level AND $currentLevel < $this->numLevels){
        $this->recurse($currentLevel + 1, 0, '');
    }
}

这给了我想要的结果。

于 2013-04-09T22:52:31.127 回答