2011-09-14 3 views
2

で2つの薄暗い配列要素を組み合わせる:

$array['A'] = array('a','b','c'); 
$array['B'] = array('d','e','f'); 
$array['C'] = array('g','h','i'); 

function combine($array) 
{ 
    $result = array(); 
    foreach($array['A'] as $a) 
     { 
     foreach($array['B'] as $b) 
     { 
      foreach($array['C'] as $c) 
      { 
       $result[] = array($a,$b,$c); 
      } 
     } 
    } 
    return $result; 
} 

(組み合わせ)が唯一のカウント($場合は、正しい結果を表示するために正常に動作しますアレイ)私は[「D」] =配列(「J」、「K」、「L」)、例えば、$配列、より$配列要素を追加する場合、それは正常に動作することができない3です。

この問題を解決するにはどうすればよいですか?

私は、再帰関数を使うべきだと思います。しかし、私はこのタイプのプログラミングでは経験がありませんでした。

私を助けることができますか?それは私を夢中にさせている。

答えて

1

ああ、素敵な問題。私は実際にこれをいくつかの機会に再実装しなければなりませんでした。私は $配列[0] $配列としてインデックス付けされる $配列[ 'A'] $配列[ 'B'] を変更

class Counter { 
    private $bases; 
    private $currNum; 
    private $increment; 
    private $maxVal; 

    public function __construct($bases) { 
     $this->bases = $bases; 
     $this->maxVal = 1; 
     $this->currNum = array(); 
     foreach ($bases as $base) { 
      $this->maxVal *= $base; 
      $this->currNum[] = 0; 
     } 
     $this->increment = 0; 
    } 

    public function increment() { 
     ++$this->increment; 
     for ($i = count($this->currNum) - 1; $i > -1; --$i) { 
      $val = $this->currNum[$i] + 1; 
      if ($val >= $this->bases[$i]) { 
       $this->currNum[$i] = 0; 
      } else { 
       $this->currNum[$i] = $val; 
       return; 
      } 
     } 
    } 

    // TODO handle overflows 
    public function hasNext() { 
     return $this->increment < $this->maxVal; 
    } 

    public function getNum() { 
     return $this->currNum; 
    } 

    public function getIncrement() { 
     return $this->increment; 
    } 
} 

// your sample arrays 
$arrays = array(
array('a', 'b', 'c'), 
array('d', 'e', 'f'), 
array('g', 'h', 'i') 
); 

// parameter to counter changes based on how many arrays you have 
// if you have 4 arrays of len 4, it'll be $counter = new Counter(array(4,4,4,4)); 
// it'll work with arrays of varying lengths as well. 
// so if you have 1 array of len 2, another of len 3 and a third of len 4: 
// $counter = new Counter(array(2,3,4)); 
$counter = new Counter(array(3,3,3)); 

$result = array(); 
while ($counter->hasNext()) { 
    $indexes = $counter->getNum(); 
    //print_r($indexes); 
    $result[] = array(); 
    foreach ($indexes as $arr => $index) { 
     $result[count($result) - 1][] = $arrays[$arr][$index]; 
    } 
    $counter->increment(); 
} 

print_r($result); 

[1]など:これはあなたのために働くべきより簡単に作業することができます。

counter->getNum() 

は配列インデックスを返します。実際にその要素を選択するかどうかを選択できます。

+0

ありがとう、魅力のように動作します! – Shila

+0

@Shila cool。それが事実であれば、あなたは投票することができますか? ;)ty –

0

あなたはそれを行うにはarray_map(null, $array['A'], $array['B'], $array['C'], $array['D'])を使用することができます。

array_mapは、コールバックとしてnull使用して、配列の配列を構築することができます。

+0

xdazzありがとうございますが、array_map()は問題を解決できません。なぜなら、$ arrayは7dim配列であり、1000個以上の要素を持っているからです。 array_mapを使用すると、たくさんのGBのメモリが必要になります。私は必要な要素を選択して$ resultを設定したい。 – Shila

+0

@Shila 7 dim配列?それはパフォーマンスには良いことではありません。データ構造を再設計する必要があります。 – xdazz

+0

データ構造を変更することはできません。パフォーマンスの向上は必要ありません。サーバーは要求を処理するのに十分強力であり、データ構造を変更する時間とコストを無駄にしています。 – Shila

0

問題は、あなたの関数のような構造の配列であるために、その引数を必要とすることである。

Array 
(
    [A] => Array() 
    [B] => Array() 
    [C] => Array() 
) 

私は別のキー「D」を追加すると、実際に機能を破壊しないことを想像、あなたは」あなたが望む結果を得られないだけです。

+0

申し訳ありませんが、英語が母国語ではありません。あなたと同じことを言っていました。 – Shila

関連する問題