Как сделать код более грамотным?

Статус
В этой теме нельзя размещать новые ответы.

Friendz

Постоялец
Регистрация
21 Июл 2007
Сообщения
128
Реакции
45
Была тут тема, человек интересовался, как можно реализовать:
Для просмотра ссылки Войди или Зарегистрируйся
Подумал, что можно предложить и быдлокод, главное, чтоб задачу выполнял..
Написал что-то, но тему закрыли.
Теперь прошу более опытных людей посмотреть, как можно реализовать задачу более красиво и наглядно.
PS (1.txt - исходный файл, 2.txt - блеклист, 3.txt - выхлоп), задача выше по ссылке.
PHP:
$input = file("1.txt");
$black = file("2.txt");
foreach ($black as $blackItem)
{
    trims($blackItem);
    foreach ($input as $inputItem)
    {
        if (!preg_match_all("/$blackItem/si",$inputItem,$matches))
        {
            $input2[]=$inputItem;
        }
    }
    unset($input);
    $input = $input2;
    unset($input2);
}
$file = "3.txt";
$fh = fopen($file,"w+");
foreach ($input as $resultItem)
{
    fwrite($fh,$resultItem);
}
fclose($fh);
function trims(&$str)
{
    $str=trim($str);
    $str=str_replace("\n","",$str);
    $str=str_replace("\r","",$str);
    $str=str_replace("\t","",$str);
    $str=stripslashes($str);
    return $str;
}
 
вот пример, в неск. раз быстрее
намного обгоняет софт ClearLinks (160 против 108 сек)(в тесте: 1,5M кеев/фильтр 2K слов)
при отключенном match_case или partial работает медленней

PHP:
$k_file = 'keys.txt';
$bw_file = 'badwords.txt';
$match_case = 'on'; # on/off
$partial = 'on'; # on/off - use fileparts

set_time_limit(0); $t_start = microtime(1);
$r_file = 'result_'.$k_file;
if($partial=='off') ini_set('memory_limit',"256M");
$fp=fopen($k_file,'r'); $fp2=fopen($r_file,'w');
$bw_list = explode(PHP_EOL,trim(file_get_contents($bw_file)));
while(!feof($fp)) { if($partial=='on')
for ($i=0,$keys='';$i<840;$i++) $keys .= fgets($fp);
else $keys= fread($fp,filesize($k_file));
$keys=($match_case=='off') ? str_ireplace($bw_list,'#&%',$keys):
str_replace($bw_list,'#&%',$keys); $keys = explode(PHP_EOL,$keys);
$keys = preg_grep("/#&%/",$keys,PREG_GREP_INVERT);
fputs($fp2,join(PHP_EOL,$keys)); } fclose($fp); fclose($fp2);
echo 'completed in '.round((microtime(1)-$t_start),2).' sec';
 
вот так можно по компактнее
PHP:
$input = file("1.txt"); 
$black = file("2.txt"); 
$file = "3.txt"; 
foreach ($black as $blackItem) 
{ 
    rtrim($blackItem); 
    foreach ($input as $inputItem) 
    { 
        if (!preg_match("/$blackItem/si",$inputItem)) 
        { 
    file_put_contents($file,$resultItem);
# чтоб на каждом круге дописовало надо третий параметр поставить FILE_APPEND

        } 
    } 
}
 
вот пример, в неск. раз быстрее
но однако уступает в скорости десктопным решениям из-за однопоточности php
PHP:
$k_file = 'keys.txt';
$bw_file = 'badwords.txt';
set_time_limit(0); ini_set('memory_limit',"256M");
$t_start = microtime(1); $keys = file_get_contents($k_file);
$bw_list = explode(PHP_EOL,trim(file_get_contents($bw_file)));
$keys=str_ireplace($bw_list,'#&%',$keys);
$keys = explode(PHP_EOL,$keys);
$keys = preg_grep("/#&%/",$keys,PREG_GREP_INVERT);
file_put_contents('result_'.$k_file,join(PHP_EOL,$keys)); // result
echo 'completed in '.round((microtime(1)-$t_start),2).' sec';

Этот вариант лучше и определенно быстрее остальных, так как не использует стандартные циклы, а тем более двойные, советую выбрать его
 
Как оказалось я только зря пытался изобретать велосипед. Бесплатный софт, который мне показывали вполне справляется с данными задачами. Даже если запускать под Вайном - все ок :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху