多维数组格式

时间:2013-04-09 03:58:55

标签: php arrays multidimensional-array foreach

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

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')

它目前将所有这些匹配返回到一个。我怎么让他们去一个不同的阵列?由于 1st $data[0]完全匹配,这很容易实现,但是如何在{{{}中为一个值循环所有可能的组合后强制使用新数组。 1}? (因此,如果$data[0]中有3个值,则会返回3个额外的数组。

截图 用户可以在电子表格中输入所需的单词选项。 Initial Input

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

var_dump

1 个答案:

答案 0 :(得分: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, '');
    }
}

这给了我想要的结果。