Foreach in Multi-Dimensional Array

时间:2013-04-08 21:35:47

标签: php arrays codeigniter multidimensional-array foreach

我正在尝试在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关键字。 所以有时数据数组可能有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;
}

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

3 个答案:

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

这很粗糙,但根据您的工作情况,您只需添加流程即可获得总体最终结果。

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

它应该可以帮助你顺利完成。

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

run code * PHP 5.4 +


稍微偏离主题但值得一提 - 我不知道你将这些“关键词”放在哪个上下文中,但像这样发送垃圾邮件可能会构成糟糕的搜索引擎优化。

答案 2 :(得分:0)

好的。几个小时之后&amp;工作中有很多合作:这里是:

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, '');
    }
}

我更改了一些变量名称,等等。但这非常有效!