[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массивы в PHP
HIDDENSY
Всем привет.

Помогите доработать функцию.
Задача данной функции:
1. Заполнить массив строками из файла.
2. Из полученной строки текста выявить все слова которых нет в массиве.
3. Записать в файл слова которых нет в файле.

PHP
<?php

function SaveFile($input,$file,$chmod='a'){
    
$fp fopen($file,$chmod);
    
flock($fp,2);
    
fputs($fp,$input);
    
flock($fp,3);
    
fclose($fp);
}


function 
ParseKeyword($searckey){

    
$del_symb = array(",""."";"":""\"""#""\$""%""^",
                         
"!""@""`""~""*""-""=""+""\\",
                         
"|""/"">""<""("")""&""?""№""\t",
                         
"\r""\n""{","}","[","]""'""“""”""•","—",
                 
"1","2","3","4","5","6","7","8","9","0","«","»");

    
$searckey strip_tags($searckey);                    // Убираем все теги HTML
    
$searckey str_replace($del_symb, array(""), $searckey);        // Заменяем все сивволы в страке из массива $del_symbols на "пробел"
    
$searckey str_replace("  "" "$searckey);                // Заменяем два пробела на один
    
$searckey strtolower($searckey);                    // Переводим строку в нихний регистр

    
$SearchText explode(" "$searckey);                    // Извлекаем слова из строки, разделение пробел

    
$Find_Keywords = array();                         // Массив для найденных строк
    
$File_Keywords file('text.txt');                    // Заносим каждую строку в массив


    
for ($w=0$w<=count($SearchText); $w++) {
        for (
$x=0$x<=count($Find_Keywords); $x++) {
            if(
strlen($SearchText[$w])>3){
                if(
$SearchText[$w]!=$Find_Keywords[$x]) SaveFile($SearchText[$w]."\n",'text.txt');
            }
    
        }
    }
}



Пример использования:

PHP
ParseKeyword("Строка из которой нужно записать в файл все слова. Если слова уже есть в файле, то туда мы их не пишем.")


В результате я получаю файл text.txt в котором слова повторяются. Подскажите как исключить повторы?



Спустя 14 минут, 44 секунды (12.10.2009 - 22:45) waldicom написал(а):
PHP
$searckey str_replace($del_symb, array(""), $searckey);        // Заменяем все сивволы в страке из массива $del_symbols на "пробел"

Тут не на пробел заменяется, а на пустую строку

Спустя 1 минута, 52 секунды (12.10.2009 - 22:47) HIDDENSY написал(а):
Цитата (waldicom @ 12.10.2009 - 19:45)
PHP
$searckey = str_replace($del_symb, array(""), $searckey);        // Заменяем все сивволы в страке из массива $del_symbols на "пробел"

Тут не на пробел заменяется, а на пустую строку

Описался немного в коментах. Бывает....

Спустя 29 секунд (12.10.2009 - 22:47) kirik написал(а):
HIDDENSY
Я бы на твоем месте переделал код немного. Обрати внимаение на функцию array_diff(), с ней код упрощается в разы. Все что нужно сделать, это прочитать слова из файла в массив, затем обработать строку и разбить ее по пробелам в массив (что ты и делаешь). Затем с помощью этой функции вытащить те слова, на которые отличаются массивы.
Если я конечно правильно понял задачу. Иначе in_array() в помощь! smile.gif

Спустя 11 минут, 43 секунды (12.10.2009 - 22:59) HIDDENSY написал(а):
Цитата (kirik @ 12.10.2009 - 19:47)
HIDDENSY
Я бы на твоем месте переделал код немного. Обрати внимаение на функцию array_diff(), с ней код упрощается в разы. Все что нужно сделать, это прочитать слова из файла в массив, затем обработать строку и разбить ее по пробелам в массив (что ты и делаешь). Затем с помощью этой функции вытащить те слова, на которые отличаются массивы.
Если я конечно правильно понял задачу. Иначе in_array() в помощь! smile.gif

Если несколько раз запустить скрипт, обновив страницу F5, то повторы всерано есть.

PHP
<?php

ParseKeyword
("Обратите внимание, что ключи сохранятся. array_unique() сначала сортирует значения как строки, сохраняет первый встреченный ключ для каждого значения и игнорирует все последующие ключи. Это не означает, что первый ключ каждого значения неотсортированного array будет сохранён.");

function 
SaveFile($input,$file,$chmod='a'){
    
$fp fopen($file,$chmod);
    
flock($fp,2);
    
fputs($fp,$input);
    
flock($fp,3);
    
fclose($fp);
}


function 
ParseKeyword($searckey){

    
$del_symb = array(",""."";"":""\"""#""\$""%""^",
                         
"!""@""`""~""*""-""=""+""\\",
                         
"|""/"">""<""("")""&""?""№""\t",
                         
"\r""\n""{","}","[","]""'""“""”""•","—",
                 
"1","2","3","4","5","6","7","8","9","0","«","»");

    
$searckey strip_tags($searckey);                    // Убираем все теги HTML
    
$searckey str_replace($del_symb, array(""), $searckey);        // Заменяем все сивволы в страке из массива $del_symbols на "пробел"
    
$searckey str_replace("  "" "$searckey);                // Заменяем два пробела на один
    
$searckey strtolower($searckey);                    // Переводим строку в нихний регистр

    
$SearchText explode(" "$searckey);                    // Извлекаем слова из строки, разделение пробел

    
$File_Keywords file('text.txt');                    // Заносим каждую строку в массив


    
$result array_diff ($SearchText$File_Keywords);

    for (
$w=0$w<=count($result); $w++) {
        if(
strlen($result[$w])>3){
            
SaveFile($result[$w]."\n",'text.txt');
        }
    
    }
}


Спустя 11 минут, 19 секунд (12.10.2009 - 23:10) HIDDENSY написал(а):
Мне бы чёткий пример, а то уже 2 часа и не туда и не сюда. А для написания кода который привел выше, потратил еще часа 3. Изучаем PHP называется.

Спустя 1 час, 53 минуты, 44 секунды (13.10.2009 - 01:04) twin написал(а):
Попробуй так
PHP
$File_Keywords array_map('rtrim'file('text.txt'));

Спустя 1 час, 53 минуты, 54 секунды (13.10.2009 - 02:58) kirik написал(а):
Да, twin решает! Только я бы немного сделал по-другому smile.gif
Код
PHP
function ParseKeyword($searckey)
{
    /*>>*/ $file = './text.txt';
    $del_symb = array(",", ".", ";", ":", "\"", "#", "\$", "%", "^",
                    "!", "@", "`", "~", "*", "-", "=", "+", "\\",
                    "|", "/", ">", "<", "(", ")", "&", "?", "№", "\t",
                    "\r", "\n", "{","}","[","]", "'", "“", "”", "•","—",
                    "1","2","3","4","5","6","7","8","9","0","«","»");

    $searckey = strip_tags($searckey); // Убираем все теги HTML
    $searckey = str_replace($del_symb, '', $searckey); // Убиваем все символы в строке из массива $del_symb
    /*>>*/ $searckey = preg_replace('/\s+/', ' ', $searckey); // Заменяем два (или несколько) пробела на один
    $searckey = strtolower($searckey); // Переводим строку в нихний регистр

    $SearchText = explode(' ', $searckey); // Извлекаем слова из строки, разделение пробел
    /*>>*/ $SearchText = array_map('MereThan3', $SearchText);
    /*>>*/ $SearchText = array_filter($SearchText);
    /*>>*/ $File_Keywords = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // Читаем файл
    $result = array_diff($SearchText, $File_Keywords);
    /*>>*/ $result = implode("\n", $result);
    /*>>*/ if(!empty($result)) {
        /*>>*/ file_put_contents($file, $result."\n", LOCK_EX | FILE_APPEND);
        print_r($result);
    }
}

function MereThan3(&$str)
{
    if(strlen($str) > 3) {
        return $str;
    } else {
        unset($str);
    } 
}

/*>>*/ пометил строки, которые поменял

Спустя 4 часа, 23 минуты, 10 секунд (13.10.2009 - 07:21) HIDDENSY написал(а):
Цитата (kirik @ 12.10.2009 - 23:58)
Да, twin решает! Только я бы немного сделал по-другому smile.gif
/*>>*/ пометил строки, которые поменял[/more]

Спасибо за пример, повторов стало меньше в разы, но все же есть.
Возможно из за того что я передаю в функцию строку текста в котором присутствует несколько повторений слова, а данного слова в массиве который из файла сделанный этого слова еще нет?

Спустя 10 часов, 19 минут, 44 секунды (13.10.2009 - 17:41) kirik написал(а):
Цитата (HIDDENSY @ 12.10.2009 - 23:21)
Возможно из за того что я передаю в функцию строку текста в котором присутствует несколько повторений слова, а данного слова в массиве который из файла сделанный этого слова еще нет?

Хм.. вероятно. Тогда сделай так:
PHP
//..........
    /*>>*/ 
$SearchText array_filter($SearchText);
    
/*>>*/ $SearchText array_unique($SearchText); // добавь это
//..........

Спустя 2 часа, 46 минут, 38 секунд (13.10.2009 - 20:27) HIDDENSY написал(а):
Цитата (kirik @ 13.10.2009 - 14:41)
Цитата (HIDDENSY @ 12.10.2009 - 23:21)
Возможно из за того что я передаю в функцию строку текста в котором присутствует несколько повторений слова, а данного слова в массиве который из файла сделанный этого слова еще нет?

Хм.. вероятно. Тогда сделай так:
PHP
//..........
    /*>>*/ $SearchText = array_filter($SearchText);
    /*>>*/ $SearchText = array_unique($SearchText); // добавь это
//..........

Сейчас попробую.

Спустя 47 минут, 23 секунды (13.10.2009 - 21:15) HIDDENSY написал(а):
Повторы есть. Из 56000 слов, повторов набралось чуть больше 2000. Видимо данную ситуацию не поберить простыми методами. А очищать и заполнять массив каждый раз наверное будет накладно для сервера.

Спустя 17 минут, 7 секунд (13.10.2009 - 21:32) kirik написал(а):
Цитата (HIDDENSY @ 13.10.2009 - 13:15)
Повторы есть

Странно.. не должно быть.. А можешь данные скинуть?

Спустя 8 минут, 11 секунд (13.10.2009 - 21:40) HIDDENSY написал(а):
У меня данные в виде сайта. генерируется страница с тектом, текст вгоняю в функцию, на выходе файл, 500 страниц сайта. Как эти данные передать я хз. если только весь тект постранично записать в файлы или в один файл.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.