2016-05-03 5 views
1

Gibt es eine Möglichkeit, Permutation aller Wörter in einer Zeichenfolge mit nur regulären Ausdruck in PHP erhalten.Permutation mit regulären Ausdruck in PHP

Zum Beispiel:

für die Eingabe wie

Ich mag Ausgabe als "Wie Schmerz im menschlichen Knie entfernen":

"How To", "Wie", "Schmerz Knie", "Knie entfernen", "Knieschmerzen", "in entfernen", "menschliches Schmerzknie", etc.

+0

Also, was Sie wollen, ist das Powerset der Wörter der Zeichenfolge richtig? Sie können dies anpassen [Antwort] (http://stackoverflow.com/questions/6092781/finding-the-subsets-of-an-array-in-php) – Richard

+0

Ich möchte nur regulären Ausdruck –

+3

Oh, richtig, habe ich diesen Teil übersprungen der Frage tut mir leid. Nun, regulärer Ausdruck soll Elemente von Strings zuordnen, nicht um einen Satz zu bilden. Sie können Regex verwenden, um Ihre Zeichenfolge zu teilen, aber letztendlich benötigen Sie mehr Code, um Ihr Ziel zu erreichen. – Richard

Antwort

0

Die Verwendung von Regex wird nur dazu dienen, den Prozess zu verlangsamen.

ich eine Funktion auf der Grundlage der powerSet() Funktion von Yada @https://stackoverflow.com/a/27968556/2943403 geschrieben geschrieben haben)

Code: (Demo)

function permStacker($array){ 
    $stack=[[]]; // declare intitial empty element 
    foreach($array as $element){ 
     foreach($stack as $combination){ 
      foreach(array_diff($array,$combination) as $left){ 
       $merge=array_merge($combination,[$left]); 
       $stack[implode(' ',$merge)]=$merge; // keys hold desired strings, values hold subarray of combinations for iterated referencing 
      } 
     } 
    } 
    unset($stack[0]); // remove initial empty element 
    return array_keys($stack); // return array of permutations as space delimited strings 
} 

$string='How to remove pain in human knee'; 
$permutations=permStacker(explode(' ',$string)); 
echo 'Total Permutations: ',sizeof($permutations),"\n"; 
var_export($permutations); 

Ausgang:

Total Permutations: 13699 
array (
    0 => 'How', 
    1 => 'to', 
    2 => 'remove', 
    3 => 'pain', 
    4 => 'in', 
    5 => 'human', 
    6 => 'knee', 
    7 => 'How to', 
    8 => 'How remove', 
    9 => 'How pain', 
    10 => 'How in', 
    11 => 'How human', 
    12 => 'How knee', 
    13 => 'to How', 
    14 => 'to remove', 
    15 => 'to pain', 
    16 => 'to in', 
    17 => 'to human', 
    18 => 'to knee', 
    19 => 'remove How', 
    20 => 'remove to', 
    21 => 'remove pain', 
    22 => 'remove in', 
    23 => 'remove human', 
    24 => 'remove knee', 
    25 => 'pain How', 
    26 => 'pain to', 
    27 => 'pain remove', 
    28 => 'pain in', 
    29 => 'pain human', 
    30 => 'pain knee', 
    31 => 'in How', 
    32 => 'in to', 
    33 => 'in remove', 
    34 => 'in pain', 
    35 => 'in human', 
    36 => 'in knee', 
    37 => 'human How', 
    38 => 'human to', 
    39 => 'human remove', 
    40 => 'human pain', 
    41 => 'human in', 
    42 => 'human knee', 
    43 => 'knee How', 
    44 => 'knee to', 
    45 => 'knee remove', 
    46 => 'knee pain', 
    47 => 'knee in', 
    48 => 'knee human', 
    49 => 'How to remove', 
    50 => 'How to pain', 
    51 => 'How to in', 

Hier ist ein Beitrag von bob at math.stackexchange, die bestätigt, dass 13699 die erwartete Größe des zurückgegebenen Arrays ist, wennangegeben wirdWörter in der Eingabezeichenfolge. Darüber hinaus sollte Bobs Zusammenbruch als Warnung dafür dienen, wie die Permutationen ziemlich schnell ansteigen - seien Sie vorsichtig mit Ihren großen Saiten.

+0

@AnkitAgarwal Es ist notwendig, dass ich Ihnen mitteilen, dass meine vorherige Methode falsch war. Wenn Sie es in einem unserer Projekte verwendet haben, ersetzen Sie die Funktion sofort, da falsche Ergebnisse erhalten wurden. Meine neue Methode erweist sich jetzt als richtig. Entschuldige meinen Fehler. – mickmackusa