Reputation: 2153
For example this is my text :
$str = 'buy new microsoft windows';
I explode text and list with array :
Array
(
[0] => buy
[1] => new
[2] => microsoft
[3] => windows
)
I want to generate words in array to something like this:
buy new
buy new windows
buy microsoft
buy microsoft windows
buy windows
new microsoft
new microsoft windows
new windows
microsoft windows
I tried with foreach and rand but I couldn't generate like showed. Is there any chance to generate just like my request?
Upvotes: 13
Views: 5017
Reputation: 3397
Found from php.net shuffle doc
function powerSet($in,$minLength = 1) {
$count = count($in);
$members = pow(2,$count);
$return = array();
for ($i = 0; $i < $members; $i++) {
$b = sprintf("%0".$count."b",$i);
$out = array();
for ($j = 0; $j < $count; $j++) {
if ($b{$j} == '1') $out[] = $in[$j];
}
$out_val = implode(" ", $out);
if (count($out) >= $minLength) {
$return[] = $out_val;
}
}
return $return;
}
print_r(powerSet($str_arr));
and the results will be,
Array
(
[0] => windows
[1] => microsoft
[2] => microsoft windows
[3] => new
[4] => new windows
[5] => new microsoft
[6] => new microsoft windows
[7] => buy
[8] => buy windows
[9] => buy microsoft
[10] => buy microsoft windows
[11] => buy new
[12] => buy new windows
[13] => buy new microsoft
[14] => buy new microsoft windows
)
Upvotes: 6
Reputation: 6046
For All Possible Combinations I improved @SujitAgarwal Answer :
Download Math_Combinatoeics.
include_once 'Combinatorics.php';
$words = array('buy','microsoft','windows');
$count = count($words);
$return = array();
$combinatorics = new Math_Combinatorics;
for ($num=1; $num <= $count; $num++ ){
foreach($combinatorics->permutations($words, $num) as $p) {
$return[] = join(' ', $p);
}
}
print_r($return);
Output :
Array
(
[0] => buy
[1] => microsoft
[2] => windows
[3] => buy microsoft
[4] => microsoft buy
[5] => buy windows
[6] => windows buy
[7] => microsoft windows
[8] => windows microsoft
[9] => buy microsoft windows
[10] => buy windows microsoft
[11] => microsoft windows buy
[12] => microsoft buy windows
[13] => windows buy microsoft
[14] => windows microsoft buy
)
Upvotes: 0
Reputation: 2092
function pc_permute($items, $perms = array( )) { if (empty($items)) { print join(' ', $perms) . "\n"; } else { for ($i = count($items) - 1; $i >= 0; --$i) { $newitems = $items; $newperms = $perms; list($foo) = array_splice($newitems, $i, 1); array_unshift($newperms, $foo); pc_permute($newitems, $newperms); } } }
source: http://docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm#phpckbk-CHP-4-EX-6
also check next example on that site
example: pc_permute( explode( ' ', 'buy new microsoft windows' ) );
buy new microsoft windows new buy microsoft windows buy microsoft new windows microsoft buy new windows new microsoft buy windows microsoft new buy windows buy new windows microsoft new buy windows microsoft buy windows new microsoft windows buy new microsoft new windows buy microsoft windows new buy microsoft buy microsoft windows new microsoft buy windows new buy windows microsoft new windows buy microsoft new microsoft windows buy new windows microsoft buy new new microsoft windows buy microsoft new windows buy new windows microsoft buy windows new microsoft buy microsoft windows new buy windows microsoft new buy
Upvotes: 3
Reputation: 522155
shuffle($array);
echo join(' ', array_slice($array, 0, mt_rand(1, count($array))));
This gives you one random "sentence". Repeat as necessary.
Upvotes: 6
Reputation: 12508
You can have a look at this PEAR PACKAGE Example usage:
<?php
require_once 'Math/Combinatorics.php';
$words = array('buy', 'new', 'microsoft');
$combinatorics = new Math_Combinatorics;
foreach($combinatorics->permutations($words, 2) as $p) {
echo join(' ', $p), "\n";
}
The output will be:
buy new
new buy
buy microsoft
microsoft buy
new microsoft
microsoft new
Upvotes: 15