(100分求)一个字符串中有好几个单词,用空格分开,如何用最简洁的方法取出最多15个单词或者单词组合?

时间:2021-06-16 19:54:05
比如“sina sohu yahoo”

取出的结果应该是
array("sina", "sina sohu", "sina yahoo", "sohu", "sohu yahoo", "yahoo");

给100分,大家多提思路,个人认为可能用正则来处理比较方便,preg_split(),嗬嗬,但是对正则表达式不熟悉。

14 个解决方案

#1


哦对了,数组里的单词数据最好能够按照原始字符串中的顺序排列

#2


不会吧,要这样子取?你是做什么用的?不要把问题想复杂了哦。

#3


<?php
$str = "sina sohu yahoo chianren baidu";
$a = explode(" ",$str);
$num = 15;
if (count($a)>=$num)
{
for ($i=0;$i<$num;$i++)
{
echo $a[$i]."<br>";
}
}else
{
for ($i=0;$i<count($a);$i++)
{
echo $a[$i]."<br>";
$total++;
}
for ($i=0;$i<count($a);$i++)
{
for ($j=$i+1;$j<count($a);$j++)
{
if ($total<15)
{
echo $a[$i]." ".$a[$j]."<br>";
$total++;
}else
{
break;
}
}
}
}

?>

#4


实现一个相关的信息列表功能,然后提交到搜索引擎搜索。

比如有一个产品数据是samsang mp3 1200 ,可以提供samsang, mp3, mp3 1200, samsang 1200等数据的搜索链接

#5


wjjchen(redfox),

可否考虑到2个以上单词连接的情况?
也许是我没说清楚吧:如果是"sina sohu yahoo chianren baidu", 那么"sina sohu yahoo"或者"sina sohu yahoo chinaren"也应该算在内的。

#6


那还是用正则吧:)

#7


<?php
$str = "1 2 3 4 5 6";
$a = explode(" ",$str);
$num = 15;
if (count($a)>=$num)
{
for ($i=0;$i<$num;$i++)
{
echo $a[$i]."<br>";
}
}else
{
for ($i=0;$i<count($a);$i++)
{
echo $a[$i]."<br>";
}
for ($i=0;$i<$num-count($a);$i++)
{
$word_num=mt_rand(2,count($a));
$rand_a=array_rand($a,$word_num);
foreach ($rand_a as $value)
{
echo $a[$value]." ";
}
echo "<br>";
}
}
?>
这个就达不到“数组里的单词数据最好能够按照原始字符串中的顺序排列”的要求了。
正则俺也不熟阿。

#8


<?php
/**
 *描述:把$input_arr进行组合操作,并返回一个包含所有组合的数组
 *参数:$input_arr 操作对象,$delimit 组合的分割符号,$n 每个组合的数组单元数
 *作者:surfchen@gmail.com
 *版权:任意复制,修改所有内容.
**/
function getSingleComb($input_arr,$delimit,$n)
{
if ($n==1)
{
return $input_arr;
}
$c_num=getCNum($n,count($input_arr));
$new_arr=array();
while (1)
{
$r_arr=array_rand($input_arr,$n);
asort($r_arr);
foreach ($r_arr as $value)
{
$tmp_str[]=$input_arr[$value];
}
$new_str=implode($delimit,$tmp_str);
unset($tmp_str);
if (!in_array($new_str,$new_arr))
{
$new_arr[]=$new_str;
}
if (count($new_arr)>=$c_num)
{
break;
}
}
return $new_arr;

}
/**
 *描述:获得组合(请参阅初等数学的排列与组合)个数
 *参数:$m 组合的单元数,$n 单元总数
 *作者:surfchen@gmail.com
 *版权:任意复制,修改所有内容.
**/
function getCNum($m,$n)
{
$store_m=$m;
$store_n=$n;
$dividend=1;
for ($m;$m>1;$m--)
{
$dividend*=$m;
}
$divisor=1;
for ($n;$n>=($store_n-$store_m+1);$n--)
{
$divisor*=$n;
}
return $divisor/$dividend;
}
/**
 *描述:把$input_arr进行组合操作,并返回一个包含所有组合的数组
 *参数:$input_arr 操作对象,$delimit 组合的分割符号,$n_arr 为一个数组,其值范围必须在从1到count($input_arr)之间
 *作者:surfchen@gmail.com
 *版权:任意复制,修改所有内容.
**/
function getMultiComb($input_arr,$delimit,$n_arr)
{
$return_arr=array();
foreach ($n_arr as $value)
{
$return_arr=array_merge($return_arr,getSingleComb($input_arr,$delimit,$value));
}
return $return_arr;
}
$input_arr=explode(" ",'sina sohu yahoo');
print_r(getMultiComb($input_arr," ",array(1,2,3)));
?>

#9


如果组合的可能超过15个,什么样的优先?

#10


现在的搜索引擎都可以直接查的吧。不用你分这么多吧。。
如果是你自己的数据表中进行搜索的话,用OR就行了吧。

#11


不知道楼主做什么用,
不过挺赞成 keaizhong(可爱钟)(19801010) 的说法,楼主可以回头看看自己的设计,看看是不是有更好的办法:)

#12


//===================================
谢谢surfchen(冲浪)和wjjchen(redfox)

冲浪的方法可行。
但希望看看其他人是否还有别的方法。

//===================================
keaizhong(可爱钟)(19801010)和yh801216(艾奥利斯),

也谢谢你们。但我只是希望把一个产品的名称split为字符串数组,然后把这些字符串加上链接,可以提供一些Similar Searches,也许误导了你们,抱歉。

#13


如果考虑速度的话,还是不要用正则表达式或split的好
不过要简单的话,用split最方便
$ws = split(" ",$w);
$i=0;
$ok = "";
foreach($ws as $w)
{
  $ok[i] = $w;
  $i++;
  if($i>15) break;
}

#14


$input_arr=explode(" ",'sina sohu yahoo,google,tom');
echo "<pre>";
print_r(getMultiComb($input_arr," ",array(1,2,3,4)));

echo "</pre>";



Warning:  array_rand(): Second argument has to be between 1 and the number of elements in the array in F:\PHP\Exercise\zuhe.php on line 19

Warning:  asort() expects parameter 1 to be array, null given in F:\PHP\Exercise\zuhe.php on line 20

Warning:  Invalid argument supplied for foreach() in F:\PHP\Exercise\zuhe.php on line 21

Warning:  implode(): Bad arguments. in F:\PHP\Exercise\zuhe.php on line 25

#1


哦对了,数组里的单词数据最好能够按照原始字符串中的顺序排列

#2


不会吧,要这样子取?你是做什么用的?不要把问题想复杂了哦。

#3


<?php
$str = "sina sohu yahoo chianren baidu";
$a = explode(" ",$str);
$num = 15;
if (count($a)>=$num)
{
for ($i=0;$i<$num;$i++)
{
echo $a[$i]."<br>";
}
}else
{
for ($i=0;$i<count($a);$i++)
{
echo $a[$i]."<br>";
$total++;
}
for ($i=0;$i<count($a);$i++)
{
for ($j=$i+1;$j<count($a);$j++)
{
if ($total<15)
{
echo $a[$i]." ".$a[$j]."<br>";
$total++;
}else
{
break;
}
}
}
}

?>

#4


实现一个相关的信息列表功能,然后提交到搜索引擎搜索。

比如有一个产品数据是samsang mp3 1200 ,可以提供samsang, mp3, mp3 1200, samsang 1200等数据的搜索链接

#5


wjjchen(redfox),

可否考虑到2个以上单词连接的情况?
也许是我没说清楚吧:如果是"sina sohu yahoo chianren baidu", 那么"sina sohu yahoo"或者"sina sohu yahoo chinaren"也应该算在内的。

#6


那还是用正则吧:)

#7


<?php
$str = "1 2 3 4 5 6";
$a = explode(" ",$str);
$num = 15;
if (count($a)>=$num)
{
for ($i=0;$i<$num;$i++)
{
echo $a[$i]."<br>";
}
}else
{
for ($i=0;$i<count($a);$i++)
{
echo $a[$i]."<br>";
}
for ($i=0;$i<$num-count($a);$i++)
{
$word_num=mt_rand(2,count($a));
$rand_a=array_rand($a,$word_num);
foreach ($rand_a as $value)
{
echo $a[$value]." ";
}
echo "<br>";
}
}
?>
这个就达不到“数组里的单词数据最好能够按照原始字符串中的顺序排列”的要求了。
正则俺也不熟阿。

#8


<?php
/**
 *描述:把$input_arr进行组合操作,并返回一个包含所有组合的数组
 *参数:$input_arr 操作对象,$delimit 组合的分割符号,$n 每个组合的数组单元数
 *作者:surfchen@gmail.com
 *版权:任意复制,修改所有内容.
**/
function getSingleComb($input_arr,$delimit,$n)
{
if ($n==1)
{
return $input_arr;
}
$c_num=getCNum($n,count($input_arr));
$new_arr=array();
while (1)
{
$r_arr=array_rand($input_arr,$n);
asort($r_arr);
foreach ($r_arr as $value)
{
$tmp_str[]=$input_arr[$value];
}
$new_str=implode($delimit,$tmp_str);
unset($tmp_str);
if (!in_array($new_str,$new_arr))
{
$new_arr[]=$new_str;
}
if (count($new_arr)>=$c_num)
{
break;
}
}
return $new_arr;

}
/**
 *描述:获得组合(请参阅初等数学的排列与组合)个数
 *参数:$m 组合的单元数,$n 单元总数
 *作者:surfchen@gmail.com
 *版权:任意复制,修改所有内容.
**/
function getCNum($m,$n)
{
$store_m=$m;
$store_n=$n;
$dividend=1;
for ($m;$m>1;$m--)
{
$dividend*=$m;
}
$divisor=1;
for ($n;$n>=($store_n-$store_m+1);$n--)
{
$divisor*=$n;
}
return $divisor/$dividend;
}
/**
 *描述:把$input_arr进行组合操作,并返回一个包含所有组合的数组
 *参数:$input_arr 操作对象,$delimit 组合的分割符号,$n_arr 为一个数组,其值范围必须在从1到count($input_arr)之间
 *作者:surfchen@gmail.com
 *版权:任意复制,修改所有内容.
**/
function getMultiComb($input_arr,$delimit,$n_arr)
{
$return_arr=array();
foreach ($n_arr as $value)
{
$return_arr=array_merge($return_arr,getSingleComb($input_arr,$delimit,$value));
}
return $return_arr;
}
$input_arr=explode(" ",'sina sohu yahoo');
print_r(getMultiComb($input_arr," ",array(1,2,3)));
?>

#9


如果组合的可能超过15个,什么样的优先?

#10


现在的搜索引擎都可以直接查的吧。不用你分这么多吧。。
如果是你自己的数据表中进行搜索的话,用OR就行了吧。

#11


不知道楼主做什么用,
不过挺赞成 keaizhong(可爱钟)(19801010) 的说法,楼主可以回头看看自己的设计,看看是不是有更好的办法:)

#12


//===================================
谢谢surfchen(冲浪)和wjjchen(redfox)

冲浪的方法可行。
但希望看看其他人是否还有别的方法。

//===================================
keaizhong(可爱钟)(19801010)和yh801216(艾奥利斯),

也谢谢你们。但我只是希望把一个产品的名称split为字符串数组,然后把这些字符串加上链接,可以提供一些Similar Searches,也许误导了你们,抱歉。

#13


如果考虑速度的话,还是不要用正则表达式或split的好
不过要简单的话,用split最方便
$ws = split(" ",$w);
$i=0;
$ok = "";
foreach($ws as $w)
{
  $ok[i] = $w;
  $i++;
  if($i>15) break;
}

#14


$input_arr=explode(" ",'sina sohu yahoo,google,tom');
echo "<pre>";
print_r(getMultiComb($input_arr," ",array(1,2,3,4)));

echo "</pre>";



Warning:  array_rand(): Second argument has to be between 1 and the number of elements in the array in F:\PHP\Exercise\zuhe.php on line 19

Warning:  asort() expects parameter 1 to be array, null given in F:\PHP\Exercise\zuhe.php on line 20

Warning:  Invalid argument supplied for foreach() in F:\PHP\Exercise\zuhe.php on line 21

Warning:  implode(): Bad arguments. in F:\PHP\Exercise\zuhe.php on line 25