|
|
|
| Хотел написать программу, котороя бы удалила из файла все одинаковые строки. Но она не корректно работает и может пропустить одинаковые строки. Вот сам скрипт:
<?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>');
}
}
}
?>
|
Если например сделать вводные данные:
То выведет:
| |
|
|
|
|
|
|
|
для: quckly
(09.02.2011 в 18:43)
| | Мб, как-то так.
<?php
$file_array = file("Z:\home\qw\www\strings.txt");
$output = array_unique($file_array);
|
| |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 18:45)
| | Хитрый пхп. На простейшие действия функции есть) | |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 18:45)
| | спасибо, раньше бы знал про это не парил бы мозги, а то нада удалить лишние строки ) | |
|
|
|
|
|
|
|
для: quckly
(09.02.2011 в 19:05)
| | Перед тем, как решать задачу, подумайте, с какой вероятностью она часто встречаемая? Если у вас возникло подозрение, что с такой задачей приходится довольно часто сталкиваться - не поленитесь заглянуть в список существующих функций. Здесь, например - по категориям, по-русски. | |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 19:10)
| | - | |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 18:45)
| | а почему всеже, тот пример с 12345616, он всеравно делает 1234566 ?????
Имею ввиду функция array_unique пропускает две 66, и также пропустила две строки, которые были уже в рабочем примере ! | |
|
|
|
|
|
|
|
для: quckly
(09.02.2011 в 19:07)
| | Значит ваши две шестерки не равны, то есть один индекс может и содержит 6, а другой 6 но с пробелом, или даже с двумя по краям. | |
|
|
|
|
|
|
|
для: 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));
|
| |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 19:15)
| | Я вам по ошибке только что "плюнул", теперь вы мне? :) | |
|
|
|
|
|
|
|
для: sim5
(09.02.2011 в 19:16)
| | Ой, все, допер.
Главное ж - думаю, там пробел или возврат каретки небось, но решил проверить - и сам же попался. | |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 19:18)
| | \r\n под Win ;-) | |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 19:15)
| | Чет я не понял .. | |
|
|
|
|
|
|
|
для: quckly
(09.02.2011 в 20:40)
| | Да прочтут и поправят меня более опытные пользователи, но по делу что-то как-то типа так.
Если вам привычнее читать что-то более научное и сухое - то сюда. Советую посетить в любом случаи, ибо я только поверхностно.
Итак, машине надо как-то сказать, что в данном конкретном месте следует создать новую строку. Для этого существуют спец. символы. Не буду говорить о разных системах счисления, бла-бла - я сам это наизусть не помню, так как никогда не сталкивался. Скажу, как это пригодится при работе в пхп.
Сначала, какие эти спец. символы бывают.
\n - новая строка (по-колхозному - интер нажимаете - курсор на новой строке)
\r - возврат каретки (то же, что происходит, если вы уже набрали несколько символов и нажимаете клавишу Home на клавиатуре - курсор переходит в самое начально строки).
Так вот, к сожалению, как обычно, разные системы считают по разному.
Так, например, в винде за новую строку считается \r\n (как в печатных машинках - надо и прокрутить бумажку, и каретку назад вернуть).
В Юникс системах - \n, т.к. по большей части сервера крутятся на линуксах, фряхах и т.д., то чаще будет встречаться это.
В Маках - там вообще \r считается за новую строку (но серверов на маке я еще не встречал).
Теперь по поводу того, как записывать. Сразу код:
<?php
file_put_contents("1\n2\n3", $fle);
|
Если мы откроем теперь это в редакторе, то увидим
С таким же успехом вы можете вместо \n написать \r\n (но зачем создавать себе же заморочки?), главное, чтобы спец. символы были указаны в двойных кавычках. В одинарных (') эта магия не подействует и вы получите в редакторе именно то, что передали на запись:
Теперь, что касается функции file.
Она возвращает в виде массива строки из файла. При этом, если внимательно прочитать мануал, можно узнать, что она не отрезает от строки конечный символ.
Т.е. по сути, из этого файла:
вы получите следующие строки:
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));
|
Вариант третий - дописывать к файлу в конец собственно символ конца строки. Однако считайте, что вы не видели этого варианта.
Возможно, есть еще какие-то варианты, но после дня бурного секса с сервером и кодинга голова не особо варит. | |
|
|
|
|
|
|
|
для: neadekvat
(09.02.2011 в 21:56)
| | array_map может принимать в качестве аргумента встроенные функции, то есть:
$arr = array_map('trim', $arr);
| Ваша пользовательская функция к тому же не учитывает пробелы. | |
|
|
|
|
|
|
|
для: sim5
(10.02.2011 в 04:30)
| | О, убейте, не помню, почему решил ввести пользовательскую функцию.
Спасибо за поправку. | |
|
|
|
|
|
|
|
для: quckly
(09.02.2011 в 18:43)
| | Я бы просто сделал ассоциативный массив с ключами равными строкам. Во-первых, удобно проверять есть ли:
Во-вторых, удобно считать сколько повторов каждой строки было.
Ключи - уникальные значения, следовательно, все повторы уберутся. Потом получить ключи и вывести их в файл совсем не трудно.
Единственное что - нужно сохранить порядок. Но тут в пхп проблем быть не должно. | |
|
|
|
|
|
|
|
для: SHAman
(09.02.2011 в 18:48)
| | Зачем, есть же array_unique(), который привели ранее. И "повторов" сколько, можно сразу получить, да и многое другое. Вы же сами сказали "хитрый РНР". ) | |
|
|
|
|
|
|
|
для: sim5
(09.02.2011 в 18:56)
| | Дык я ответил сначала, а потом увидел ответ про эррей_юник.
В перле такой функции нет, поэтому я бы прогнал цикл по предложенному алгоритму. | |
|
|
|