【问题标题】:Simplify and Abstract my Code: Combining Strings简化和抽象我的代码:组合字符串
【发布时间】:2012-02-04 21:14:22
【问题描述】:

我想在 PHP 中组合字符串。我的脚本创建了所有可能的组合,如下所示。

$part1 = array('','d','n','s','g');
$part2 = array('a','e','o','oo');
$part3 = array('m','n','s','d','l','t','g','j','p');
$part4 = array('g','p','l','');
$part5 = array('g','p','l');
$part6 = array('a','e','o');
$part7 = array('d','l','r','');

$names = array();

foreach ($part1 as $letter1) {
    foreach ($part2 as $letter2) {
        foreach ($part3 as $letter3) {
            foreach ($part4 as $letter4) {
                foreach ($part5 as $letter5) {
                    foreach ($part6 as $letter6) {
                        foreach ($part7 as $letter7) {
                            $names[] = $letter1 . $letter2 . $letter3 . $letter4 . $letter5 . $letter6 . $letter7;
                        }
                    }
                }
            }
        }
    }
}

但我对我的解决方案不满意。我是快速而肮脏的代码。是否有一个解决方案可以使用灵活数量的部分数组,所以我可以通过例如扩展脚本$part8 容易吗? (不改变循环结构)

【问题讨论】:

  • stackoverflow.com/questions/2516599/… 的可能副本。似乎您正在寻找一组数组的笛卡尔积。
  • 可能是一个愚蠢的问题,但该代码是做什么用的?我可以看到它的作用,但是对于那些字母,我看不出你会用它做什么。
  • @Steve:它将成为名称生成器。

标签: php coding-style foreach code-cleanup


【解决方案1】:

递归一:

function buildNames( $parts, $chars = ''){
  // Nothing to do, shouldn't happen
  if( !count( $parts)){
    return array();
  }

  $names = array();
  $part = array_shift( $parts);
  // Max level, we can build final names from characters
  if( !count( $parts)){
     foreach( $part as $char){
        $names[] = $chars . $char;
     }
     return $names;
  }

  // "We need to go deeper" and build one more level with remembered chars so far
  foreach( $part as $char){
     $names = array_merge( $names, buildNames( $parts, $chars . $char));
  }

  return $names;
}

$parts = array( $part1, $part2, $part3, $part4, $part5, $part6, $part7);
$names = buildNames( $parts);

从头开始,如果有问题,请发表评论,但想法应该是好的

【讨论】:

  • 好主意!但这似乎是一个无限循环,因为我收到超时错误。
  • 它不应该...尝试调试它并让我知道错误在哪里我只是没有看到它:-/
  • 我不是一个不熟悉递归函数的高级程序员。所以我不知道如何成功调试。我在函数顶部添加了一个简单的echo '.';。它呼应了数百万个点。
  • @sharethis 您上面的示例数组返回 25919(在我的桌面上运行大约第二个),尝试在 $names[] = $chars . $char; 之后添加 echo $chars . $char . "\n"。)这个婴儿呈指数增长。
  • 好的,开始工作了。我的脚本只是一个不同的问题。谢谢你的回答,很好!
【解决方案2】:

您可以将此问题简化为六个笛卡尔积:

cartesianProduct($part1, 
  cartesianProduct($part2, 
    cartesianProduct($part3, 
      cartesianProduct($part4, 
        cartesianProduct($part5, 
          cartesianProduct($part6, $part7))))));


function cartesianProduct($p1, $p2) {
   $ret = array();
   foreach($p1 as $l1)
     foreach($p2 as $l2) 
        $ret[] = $l1 . $l2;
   return $ret;
}

【讨论】:

    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多