Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не работет скрипт нахождения одинаковых строк
 
 автор: quckly   (09.02.2011 в 18:43)   письмо автору
 
 

Хотел написать программу, котороя бы удалила из файла все одинаковые строки. Но она не корректно работает и может пропустить одинаковые строки. Вот сам скрипт:
<?php

    $file_array 
file("Z:\home\qw\www\strings.txt");
    
    if(!
$file_array)
    {
        echo(
"Ошибка открытия файла");
    }
    else
    {
        
$num_str count($file_array);
        
        for(
$i=0$i $num_str$i++)
        {
            if(
$file_deleted[$i] != true)
            {
                for(
$h=0$h $num_str$h++)
                {
                    if(
$file_deleted[$h] != true)
                    {
                        if(
$i != $h)
                        {
                            if(
$file_array[$i] == $file_array[$h])
                            {
                                
$file_deleted[$h] = true;
                            }
                        }
                    }
                }
            }
        }
        
        for(
$i=0$i <= $num_str$i++)
        {
            if(
$file_deleted[$i] != true)
            {
                echo (
$file_array[$i].'<br>');
            }
        }
    }

?>

Если например сделать вводные данные:
1
2
3
4
1
5
6
1
6

То выведет:






6

  Ответить  
 
 автор: neadekvat   (09.02.2011 в 18:45)   письмо автору
 
   для: quckly   (09.02.2011 в 18:43)
 

Мб, как-то так.

<?php
$file_array 
file("Z:\home\qw\www\strings.txt");
$output array_unique($file_array);

  Ответить  
 
 автор: SHAman   (09.02.2011 в 18:48)   письмо автору
 
   для: neadekvat   (09.02.2011 в 18:45)
 

Хитрый пхп. На простейшие действия функции есть)

  Ответить  
 
 автор: quckly   (09.02.2011 в 19:05)   письмо автору
 
   для: neadekvat   (09.02.2011 в 18:45)
 

спасибо, раньше бы знал про это не парил бы мозги, а то нада удалить лишние строки )

  Ответить  
 
 автор: neadekvat   (09.02.2011 в 19:10)   письмо автору
 
   для: quckly   (09.02.2011 в 19:05)
 

Перед тем, как решать задачу, подумайте, с какой вероятностью она часто встречаемая? Если у вас возникло подозрение, что с такой задачей приходится довольно часто сталкиваться - не поленитесь заглянуть в список существующих функций. Здесь, например - по категориям, по-русски.

  Ответить  
 
 автор: sim5   (09.02.2011 в 19:13)   письмо автору
 
   для: neadekvat   (09.02.2011 в 19:10)
 

-

  Ответить  
 
 автор: quckly   (09.02.2011 в 19:07)   письмо автору
 
   для: neadekvat   (09.02.2011 в 18:45)
 

а почему всеже, тот пример с 12345616, он всеравно делает 1234566 ?????
Имею ввиду функция array_unique пропускает две 66, и также пропустила две строки, которые были уже в рабочем примере !

  Ответить  
 
 автор: sim5   (09.02.2011 в 19:13)   письмо автору
 
   для: quckly   (09.02.2011 в 19:07)
 

Значит ваши две шестерки не равны, то есть один индекс может и содержит 6, а другой 6 но с пробелом, или даже с двумя по краям.

  Ответить  
 
 автор: neadekvat   (09.02.2011 в 19:15)   письмо автору
 
   для: sim5   (09.02.2011 в 19:13)
 

Попробуйте следующий код - довольно интересный результат получается (посмотрите на числовой индекс последнего значения)
<?php
$str 
'1
2
3
4
5
5
5
5'
;

$arr explode("\n"$str);

print_r(array_unique($arr));

  Ответить  
 
 автор: sim5   (09.02.2011 в 19:16)   письмо автору
 
   для: neadekvat   (09.02.2011 в 19:15)
 

Я вам по ошибке только что "плюнул", теперь вы мне? :)

  Ответить  
 
 автор: neadekvat   (09.02.2011 в 19:18)   письмо автору
 
   для: sim5   (09.02.2011 в 19:16)
 

Ой, все, допер.
Главное ж - думаю, там пробел или возврат каретки небось, но решил проверить - и сам же попался.

  Ответить  
 
 автор: sim5   (09.02.2011 в 19:19)   письмо автору
 
   для: neadekvat   (09.02.2011 в 19:18)
 

\r\n под Win ;-)

  Ответить  
 
 автор: quckly   (09.02.2011 в 20:40)   письмо автору
 
   для: neadekvat   (09.02.2011 в 19:15)
 

Чет я не понял ..

  Ответить  
 
 автор: neadekvat   (09.02.2011 в 21:56)   письмо автору
 
   для: quckly   (09.02.2011 в 20:40)
 

Да прочтут и поправят меня более опытные пользователи, но по делу что-то как-то типа так.

Если вам привычнее читать что-то более научное и сухое - то сюда. Советую посетить в любом случаи, ибо я только поверхностно.

Итак, машине надо как-то сказать, что в данном конкретном месте следует создать новую строку. Для этого существуют спец. символы. Не буду говорить о разных системах счисления, бла-бла - я сам это наизусть не помню, так как никогда не сталкивался. Скажу, как это пригодится при работе в пхп.

Сначала, какие эти спец. символы бывают.
\n - новая строка (по-колхозному - интер нажимаете - курсор на новой строке)
\r - возврат каретки (то же, что происходит, если вы уже набрали несколько символов и нажимаете клавишу Home на клавиатуре - курсор переходит в самое начально строки).

Так вот, к сожалению, как обычно, разные системы считают по разному.
Так, например, в винде за новую строку считается \r\n (как в печатных машинках - надо и прокрутить бумажку, и каретку назад вернуть).
В Юникс системах - \n, т.к. по большей части сервера крутятся на линуксах, фряхах и т.д., то чаще будет встречаться это.
В Маках - там вообще \r считается за новую строку (но серверов на маке я еще не встречал).

Теперь по поводу того, как записывать. Сразу код:
<?php
file_put_contents
("1\n2\n3"$fle);

Если мы откроем теперь это в редакторе, то увидим
1
2
3

С таким же успехом вы можете вместо \n написать \r\n (но зачем создавать себе же заморочки?), главное, чтобы спец. символы были указаны в двойных кавычках. В одинарных (') эта магия не подействует и вы получите в редакторе именно то, что передали на запись:
1\n2\n3


Теперь, что касается функции file.
Она возвращает в виде массива строки из файла. При этом, если внимательно прочитать мануал, можно узнать, что она не отрезает от строки конечный символ.
Т.е. по сути, из этого файла:
1
2
3

вы получите следующие строки:
0 => 1\n,
1 => 2\n,
2 = 3\n,
ну, или \r\n, смотря как был записан файл (в моем редакторе, например, можно выбрать, каким стандартом будет обозначаться конец строки).

Таким образом, чтобы у вас успешно заработала функция array_anique, вам придется таки удлинить код:
Вариант первый - забирать весь файл и разбивать на массив вручную.
Вариант второй - избавлять строки от уже ненавистных переносов.
<?php
function own_trim($arg)
{
    return 
rtrim($arg"\r\n");
}

$arr file('file');

$arr array_map('own_trim'$arr);

print_r(array_unique($arr));

Вариант третий - дописывать к файлу в конец собственно символ конца строки. Однако считайте, что вы не видели этого варианта.

Возможно, есть еще какие-то варианты, но после дня бурного секса с сервером и кодинга голова не особо варит.

  Ответить  
 
 автор: sim5   (10.02.2011 в 04:30)   письмо автору
 
   для: neadekvat   (09.02.2011 в 21:56)
 

array_map может принимать в качестве аргумента встроенные функции, то есть:
$arr = array_map('trim', $arr);
Ваша пользовательская функция к тому же не учитывает пробелы.

  Ответить  
 
 автор: neadekvat   (10.02.2011 в 10:37)   письмо автору
 
   для: sim5   (10.02.2011 в 04:30)
 

О, убейте, не помню, почему решил ввести пользовательскую функцию.
Спасибо за поправку.

  Ответить  
 
 автор: SHAman   (09.02.2011 в 18:48)   письмо автору
 
   для: quckly   (09.02.2011 в 18:43)
 

Я бы просто сделал ассоциативный массив с ключами равными строкам. Во-первых, удобно проверять есть ли:

if($lines[$line]) {есть}


Во-вторых, удобно считать сколько повторов каждой строки было.
$lines[$line]++;


Ключи - уникальные значения, следовательно, все повторы уберутся. Потом получить ключи и вывести их в файл совсем не трудно.

Единственное что - нужно сохранить порядок. Но тут в пхп проблем быть не должно.

  Ответить  
 
 автор: sim5   (09.02.2011 в 18:56)   письмо автору
 
   для: SHAman   (09.02.2011 в 18:48)
 

Зачем, есть же array_unique(), который привели ранее. И "повторов" сколько, можно сразу получить, да и многое другое. Вы же сами сказали "хитрый РНР". )

  Ответить  
 
 автор: SHAman   (10.02.2011 в 10:02)   письмо автору
 
   для: sim5   (09.02.2011 в 18:56)
 

Дык я ответил сначала, а потом увидел ответ про эррей_юник.

В перле такой функции нет, поэтому я бы прогнал цикл по предложенному алгоритму.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования