2016-10-27 7 views
1

PHP: PHP - 文字列のすべての非反復の組み合わせ(関係なく順番)を取得

$strings=array("asd","qwerty","123");// or more 

私はすべての非繰り返しの組み合わせを取得したいのですが(関係なく同じように、非反復的な文字列のリストを考えます順)

asd  
    asd qwerty 
    asd 123 
    asd qwerty 123 
    qwerty   
    qwerty 123 
    123  

のような、私は可能な限り最も効率的なアルゴリズムを探していますし、単一の関数で

+0

リストは常に配列になりますか、個々の変数があるでしょうか? – useyourillusiontoo

+0

リストは常に の配列( "str1"、 "str2"、 "str3"、 "str4"、 "str5"など)のような配列になります – Miky

+0

明確にするために - 順序を問題にして、異なる順序で同じ値が繰り返しになることを意味するのですか?そうではありませんか? –

答えて

0

主なアイデアは、組み合わせの数をあるN^2である - ここで、n =、文字列のカウント1:で開始するには、このを試してみます。したがって、i番目の組み合わせのバイナリ表現を使用して、独自の組み合わせを構築することができます。コードで

それは次のようになります。

$someArray = ['abc', 'def', 'foo', 'bar']; 
$combinations = pow(2, count($someArray)) - 1; 

$result = []; 

for ($i = 0; $i < $combinations; $i++) { 

    $result[$i] = []; 

    for ($j = 0; $j < count($someArray); $j++) { 
     // here we check if j-th bit of i is equal to 1 
     if (($i >> $j) & 1 == 1) { 
      $result[$i][] = $someArray[$j]; 
     } 
    } 
} 
+0

の完璧に近い!それはもっと値を持っていて、 "すべての文字列"の値ではありません。 – Miky

+0

私は間違いを犯しました。 ($ i = 1; $ i <= $組み合わせ; $ i ++) – lamik

+0

の場合は で簡単に修正できます。どうもありがとう – Miky

0

は最速のためではなく、単にソリューションの観点から試みていません(すべての文字列が異なる場合)

$strings=array("asd","qwerty","123");// or more 
$sortstrings=natsort(array_unique($strings)); // sort and remove duplicates 
$new_arr=array(); 
foreach ($strings as $str) 
{ 
    foreach($new_arr as $new) 
    { 
     $newstr="$new$str"; 
     if (!in_array("$newstr",$new_arr)) 
     $new_arr[]="$newstr"; 
    } 
    if (!in_array("$str",$new_arr)) 
     $new_arr[]="$str"; 
} 
+0

あなたは忘れてしまったと思います! if文では、しかし、とにかく私は "asd、qwerty、123" – Miky

関連する問題