1

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簡単にスクリプトを拡張できますか?(ループ構造を変更せずに)

4

2 に答える 2

4

再帰的なもの:

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

頭から、最初から、何かあればコメントしますが、アイデアは良いはずです

于 2012-02-04T21:21:35.357 に答える
1

この問題を6つのデカルト積に減らすことができます。

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;
}
于 2012-02-04T21:22:50.340 に答える