【问题标题】:Generate word combinations生成单词组合
【发布时间】:2011-09-14 15:15:51
【问题描述】:

例如这是我的文字:

$str = 'buy new microsoft windows';

我用数组分解文本和列表:

Array
(
    [0] => buy
    [1] => new
    [2] => microsoft
    [3] => windows
)

我想在数组中生成类似这样的单词:

buy new
buy new windows
buy microsoft 
buy microsoft windows
buy windows
new microsoft
new microsoft windows
new windows
microsoft windows

我尝试使用 foreach 和 rand,但无法生成如图所示的内容。有没有机会像我的请求一样生成?

【问题讨论】:

  • 生成的词是随机生成的吗? windows new microsoft 是否有效?
  • 你想要所有可能的排列还是任意随机组合
  • @Luzhin 是的,它们是随机创建的。有效并不重要。
  • @Teneff 不,我不需要他们的话。
  • 也许你可以解释一下你给出的例子背后的逻辑?因为我真的什么都看不到。

标签: php word


【解决方案1】:

你可以看看这个PEAR PACKAGE 示例用法:

<?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"; 
}

输出将是:

buy new
new buy
buy microsoft
microsoft buy
new microsoft
microsoft new

【讨论】:

  • 我正在制作自己的排列函数示例,但这更好。 :P
  • 有没有机会像我的请求一样生成?
  • 你可以试试这个 PEAR 包。它提供了很多功能
  • 答案与所需的输出不匹配。请参阅下面 Paulraj 的回答。
【解决方案2】:
shuffle($array);
echo join(' ', array_slice($array, 0, mt_rand(1, count($array))));

这会给你一个随机“句子”。根据需要重复。

【讨论】:

  • 你能解释一下如何列出outpots吗?
【解决方案3】:
函数 pc_permute($items, $perms = array()) { 如果(空($items)){ 打印加入('',$perms)。 "\n"; } 别的 { for ($i = count($items) - 1; $i >= 0; --$i) { $newitems = $项目; $newperms = $perms; list($foo) = array_splice($newitems, $i, 1); array_unshift($newperms, $foo); pc_permute($newitems, $newperms); } } }

来源:http://docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm#phpckbk-CHP-4-EX-6

同时查看该站点上的下一个示例


示例:pc_permute( explode( ' ', 'buy new microsoft windows' ) );

购买新的微软视窗 新购买微软视窗 购买微软新视窗 微软购买新窗口 新的微软购买 Windows 微软新购买窗口 购买新的 Windows 微软 新购买 Windows 微软 购买 Windows 新微软 windows 购买新的微软 新窗口购买微软 windows 新 购买 microsoft 购买新的微软视窗 微软购买新的 Windows 购买 Windows 微软新 windows 购买微软新的 微软 windows 购买新的 windows 微软 购买新的 新的微软视窗购买 微软新视窗购买 微软购买新视窗 windows 新 微软 购买 微软 Windows 新购买 windows 微软 新 购买

【讨论】:

  • 您可以将输出添加到您的答案中吗?评论有点难读;)
【解决方案4】:

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

结果会是,

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
)

【讨论】:

  • 这应该是答案。如此优雅的解决方案。
  • 幂集不包含反转,例如“windows new”不存在。
  • @Saeven 这个问题不需要倒置,所以相应地回答它。
【解决方案5】:

对于所有可能的组合,我改进了@SujitAgarwal 答案:

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

输出:

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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2022-08-24
    • 2019-08-20
    相关资源
    最近更新 更多