2012-02-07 2 views
1

성능을 높이는 방법이 있습니까? 왜냐하면 약 8 초가 걸리기 때문입니다. car_models 데이터베이스는 100.000 개가 넘고, cars 데이터베이스는 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 [ '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

많은 감사합니다. –