2

我正在尝试在 PHP中练习/学习foreach循环。我了解基本的foreach。但我在多维度上挣扎。

我有一个数组来测试它:

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

我想做的是循环遍历每一个可能的组合并将其分配给它自己的数组(稍后将显示为列)。

First column ('New York', 'New York City')
second column ('New York hotel', 'New York lodging', 'New York motel')
third column ('New York City hotel', 'New York City lodging', 'New York City motel')
fourth column ('New York hotel cheap', 'New York lodging cheap', 'New York motel cheap')
fifth column ('New York City hotel cheap', 'New York City lodging cheap', 'New York City motel cheap')

我将如何做到这一点?我已经尝试了几件事,但还没有接近。

更新 我的最终目标是让个人能够获取项目列表,并尝试找到所有可能的关键字。然后,这将有助于识别他们可以考虑使用的不同 SEO 关键字。所以有时 Data 数组可能有 2 个子数组,有时它可能有 3 或 4 个。所以它需要有点动态。

第一次解决方案尝试

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;
}

但是,这会在一个数组中返回我的所有单词。这不符合我正在寻找的要求。

4

3 回答 3

2

您需要做的是创建一个函数,它会递归地为您执行此操作,例如......

// function for building recursive tree arrays
function recursive($array) {
    foreach($array as $key => $value) {
        if(is_array($value)) {
            // if it is an array, it will run again
            recursive($value);
        } else {
            // do something with values here
        }
    }
    // return your result set here
}

$data = array(
        array('key', 'key2'),
        array('word', 'word2','word3'),
        array(array('more','levels','than','you','need'), 'then','some','more')
    );

$result = recursive($data);

这很粗糙,但取决于您在做什么,您只需添加您的流程即可得出最终的总结果。

基本上,不管你的数组有多少深度,或者数组结构的顺序,它都会继续运行。您需要做的就是确保您发送(返回)函数每次扫描的结果,这取决于您对每个级别所做的事情。

不过,它应该能让你顺利上路。

于 2013-04-08T22:07:12.773 回答
1

好的,这是一个非递归解决方案,我相信只要您的$data数组保持二维,它就会遵循所需的模式。我不会承认这实际上花了我多少次尝试......

$cols = array(array_shift($data));
while($row = array_shift($data))
  array_walk(count($cols)<=1 ? $cols : array_slice($cols, 1), 
  function($col) use($row, &$cols){
    foreach($col as $i => $prev)
      foreach($row as $j => $word)
          $tmp[count($cols)===1?$i:$j][] = "$prev $word";
    foreach($tmp as $t) $cols[] = $t;
  });

运行代码 * PHP 5.4 +


稍微偏离主题但值得一提 - 我不知道您将这些“关键字”放入什么上下文中,但像这样向它们发送垃圾邮件可能会构成糟糕的 SEO。

于 2013-04-09T10:04:27.837 回答
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:49:27.440 回答