2012-02-07 13 views
1

パフォーマンスを向上させる方法はありますか?それは約8秒かかりました。 car_modelsデータベースのレコード数は100,000以上、自動車データベースのレコード数は20,000以上、car_partsのレコード数は20,000以上です。私はそのようなキーワードのようなデータベースのために行うことができます。しかし、問題はデータベースが動的であることです。私は、毎日編集者が追加したレコードを意味します。そして、それはオープンソースではありませんので、私は...php mysqlとin_arrayのパフォーマンス

$news = dbquery("SELECT * FROM " . DB_NEWS . " ORDER BY news_id DESC LIMIT 0,1"); 
while ($news_data = dbarray($news)) 
{ 

    echo $news_data['news_subject']; 
    $news_first_part = str_replace("\\", "", $news_data['news_news']); 
    $news_first_part = explode('.', $news_first_part); //first phrase 
    $news_first_part = $news_first_part[0]; 
    $news_second_part = str_replace("\\", "", $news_data['news_extended']); 
    $find = array(); 
    $keywords = dbquery("SELECT name FROM cars GROUP BY name"); 
    while ($keywords_data = dbarray($keywords)) 
    { 

     $my_keyword = $keywords_data['name']; 
     $news_first_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_first_part); 
     $news_second_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_second_part); 
     if ($news_first_part OR $news_second_part AND !in_array($my_keyword, $find,true)) 
     { 

      array_push($find, $my_keyword); 

     } 



    } 


    $my_keyword=""; 
    $keywords = dbquery("SELECT name FROM car_models GROUP BY name"); 
    while ($keywords_data = dbarray($keywords)) 
    { 

     $my_keyword = $keywords_data['name']; 
     if (strlen($my_keyword) > 10 && !in_array($my_keyword, $find, true)) 
     { 

      $news_first_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_first_part); 
      $news_second_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_second_part); 

     } 



    } 


    $keywords = dbquery("SELECT name FROM car_parts GROUP BY name"); 
    while ($keywords_data = dbarray($keywords)) 
    { 

     $my_keyword = $keywords_data['name']; 
     if (strlen($my_keyword) > 10) 
     { 

      $news_first_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_first_part); 
      $news_second_part = str_replace($my_keyword, "<a href='keyword.php?keyword=$my_keyword' title='$my_keyword'>$my_keyword</a>", $news_second_part); 

     } 



    } 


    $my_keyword=""; 
    echo $news_first_part . '.'; //note I added the final ponctuation 
    $news_first_part .= "."; 
    $news_second_part = str_replace($news_first_part, "", $news_second_part); 
    echo nl2br($news_second_part); 

} 
+0

繰り返しキーワードがありますか? – Cheery

+0

はい、私は配列を確認する必要がある –

答えて

1

のようなものになるだろう。

if ($news_first_part OR $news_second_part AND !isset($find[$my_keyword])) 
     { 

      $find[$my_keyword] = 1; 

     } 

これに対応してコードを更新します。実際には!isset($find[$my_keyword])のチェックは必要ありません。

+0

残念ながら私はキーワードを返信しました.. –

+1

@ dr.linux私の例を試してみてください。あなたはそれらの存在を配列でチェックしているので、それらを繰り返さない。 – Cheery

+0

あなたは私の夜を救う!多くのおかげで今は約3秒で、それは私の意見では容認できます!情報をありがとう! –

2

のソフトウェアの一部に触れることができないあなたは、サブアレイのサイズを制限するために、配列のツリー構造のいくつかの種類を構築することができます。配列は次のようになります。

  • $ arr ['a'] ['apple'];
  • $ arr ['a'] ['anna'];
  • $ arr ['a'] ['awesome'];
  • $ arr ['b'] ['bread'];
  • $ arr ['b'] ['beer'];
  • $ arr ['c'] ['cucumber'];代わりに

    • の$ ARR [ 'りんご']の

  • $ arr ['anna'];
  • $ arr ['awesome'];
  • $ arr ['bread'];
  • $ arr ['beer'];
  • $ arr ['cucumber'];

ご覧のとおり、in_arrayは非常に高速になります。

  • 私たちは、「PHP」をチェックしたい場合は、最初の文字「P」の配列はありません。私たちは「アナナス」をチェックしたい場合は何も再び
  • を歩いする必要がない、我々は6の代わりに3つのアイテムを検索する必要があります。

注:外側の配列は、セットのサイズに応じて、最初の文字(または2、3、4など)で構成できます。

PHPコードでは、それははるかに高速である、このようにそれを試してみてください

$word = "ananas"; 
$arr = array(); 
if (!isset($arr[$word{0}]) || !in_array($word, $arr[$word{0})) { 
    // New word 
    if (!isset($arr[$word{0}])) { 
    $arr[$word{0}] = array($word); 
    } else { 
    $arr[$word{0}][] = $word; 
    } 
} 
+0

情報のために多くの感謝。 –

関連する問題