ホームページ > バックエンド開発 > PHPチュートリアル > この関数を簡素化するのを手伝ってください。

この関数を簡素化するのを手伝ってください。

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-13 13:26:45
オリジナル
872 人が閲覧しました

この関数を簡略化してください。

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><?php

$varchar='德国和丹麦都在第一场比赛1-0获胜,在次轮比赛中,德国2-1击败荷兰,两场小组赛战罢,德国队虽然拿到了6分,但依然未能保证出线,最后一场如果输给丹麦仍然有出局可能。丹麦上一场在0-2落后的情况下连追两球,但最后还是2-3输给葡萄牙,将小组次席拱手让给葡萄牙。

丹麦想要出线必须力争击败德国,好在他们也不缺乏击败德国的感觉。在两队最近3场交手中,丹麦令人吃惊地2胜1平占据上风,最近一次交手是在2010年8月,丹麦在落后两球情况下扳平比分。两队上一次在欧洲杯交手则是1992年欧洲杯决赛,当时正是丹麦童话的巅峰,北欧人2-0击败德国夺冠。

在德国队前两场比赛中,戈麦斯成为最大的亮点。超级马里奥连续两场比赛包揽了德国3粒进球,恐怖的是他进3球居然只花了6脚射门。戈麦斯目前以3球排名射手榜首位,自从1976年欧洲杯穆勒单届射进4球以来,德国队此后36年还没有任何球员欧洲杯单届进球超过3个。左边锋波多尔斯基在此前两场小组赛均打满全场,国家队出场次数达到99场,本场有望实现百场。

双方都没有对首发阵容进行大的调整,德国队只是因为博阿滕停赛而派上了本德,丹麦也只换上鲍尔森,队内元老罗梅达尔因伤缺席。本场德国前锋波多尔斯基迎来国家队第100场比赛,小将本德则是首次在国家队首发。

第2分钟,赫迪拉禁区前沿左侧传中,中路无人拿到皮球,后点穆勒胸部停球后左脚抽射稍稍高出。第5分钟,丹麦左侧角球,本特纳远点头球攻门被诺伊尔拿到。1分钟后,德国迅速反击,厄齐尔左侧直塞,波多尔斯基传中,克亚尔解围不力,穆勒门前3米处射门被安德森神奇化解。第12分钟,戈麦斯禁区外围左脚远射高出。';


$keyword="本德|鲍尔森";
//$keyword="射门|本德|鲍尔森";
//$keyword="丹麦|角球|头球|神奇";


function pipeidu($keyword,$varchar,$length){
    $keyexp=explode('|',$keyword);
    $keyNum=count($keyexp);
$ar = preg_split('/('.$keyword.')/', $varchar, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE);
for($j=0; $j<count($ar)-1; $j++) {
  $t = $ar[$j][1];
  $r[$t] = 0;
  for($i=$j; $i<count($ar); $i++) {
    if($ar[$i][0] == '本德'||$ar[$i][0] == '鲍尔森') {  //[color=#FF0000]求此处适应一个或多个词组,越精简越好[/color]。
      if($ar[$i][1]+strlen($ar[$i][0]) - $t < $length) $r[$t]++;
      else $r[$t=$ar[$i][1]] = 0;
    }
  }
}
if(isset($r)&&count($r)>0){
arsort($r);
$r=array_keys($r);
return $r=substr($varchar,$r[0],$length);
}
else{return $r=substr($varchar,0,$length);}
}
?>
ログイン後にコピー


-----解決策--------- ----- -----
ははは、あなたはこれらの半障害者用パッケージを使用するのが好きなようですね。
------解決策------------------
qq120848369
lz のコードはあなたの言ったことではありません http://topic.csdn.net/u/20120619/02/c024bcf0-9c61-4e61-b58c-2844f0af2310.html
1、スキャンしてすべて調べてくださいキーワード。
2. 再度スキャンして、各 end_index 位置の前のキーワードの合計数を計算し、180 文字前の beg_index 位置のキーワードの数の差も計算します。
3. キーワードの差が最も大きい長さ 180 のセグメントについて、strrstr と strstr は最初から最後までキーワードを検索し、文字数が少なくなるように余分な部分を切り取ります。

という発想でやったんですか?
1. preg_split を使用してすべてのキーワードを検索します
2. 各キーワードが出現する位置から開始して、指定された長さ内のキーワードの出現数をカウントします (二重ループ)

もちろん lz コード
$t = $ar[$j][1];
$r[$t] = 0;
および
の外側のループ内の
など、最適化可能な場所も使用します。内側のループの $r[$t=$ar[$i][1]] = 0;
には繰り返し計算の問題があります (外側の $j がすべてのキーワード ノードを走査しているため)
関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート