Simpliest Не, я не так пишу. Я пишу не максимально компактно и аскетично, а чтобы выглядело человечно PHP: <?php class parse { const POSTOYANNAYA = 'content|||'; private $files = array(); private $beginfrom = array(1 => null, 2 => null, 3 => null, 4 => null); private $errors = array(); private $result = array(); public $rname = null; public function loadFile($fname) { if (is_readable($fname)) { array_push($this -> files, file($fname, FILE_IGNORE_NEW_LINES)); } else { $this -> errors[] = 'File "'.$fname.'" is a not readable.'; } } public function setRname($name) { if (empty($name)) { $this -> errors[] = 'Incorrect name for result file.'; } else { $this -> rname = $name; } } public function setBegin($fnum, $val) { if (!is_numeric($val)) { $this -> errors[] = 'Inccorect line number at file #'.$fnum.'.'; } elseif (count($this -> files[$fnum]) < $val) { $this -> errors[] = 'Line #'.$val.' not found in the file #'.$fnum.'.'; } else { $this -> beginfrom[$fnum] = $val; } } public function run() { if (!empty($this -> errors)) { echo "<pre>Errors:\r\n"; print_r($this -> errors); echo '</pre>'; return 0; } else { end($this -> files[0]); end($this -> files[1]); end($this -> files[2]); $last0 = key($this -> files[0]); $last1 = key($this -> files[1]); $last2 = key($this -> files[2]); $this -> begin(0); $this -> begin(1); $this -> begin(2); reset($this -> files[3]); foreach($this -> files[3] as $string) { $buffer = null; $curr0 = current($this -> files[0]); $curr1 = current($this -> files[1]); $curr2 = current($this -> files[2]); $buffer = $curr0.'|'.$curr1.'|'.$curr2.'|'.self::POSTOYANNAYA.'|'.$string.'|http://'.$string; if (key($this -> files[0]) == $last0) { $this -> begin(0); } if (key($this -> files[1]) == $last1) { $this -> begin(1); } if (key($this -> files[2]) == $last2) { $this -> begin(2); } next($this -> files[0]); next($this -> files[1]); next($this -> files[2]); array_push($this -> result, $buffer); } echo '<b>Result file: <a href="'.$this -> rname.'" target="_blank">'.$this -> rname.'</a></b>'; $this -> save(); } } private function begin($num) { reset($this -> files[$num]); for($i = 1; $i < $this -> beginfrom[$num]; $i++) { next($this -> files[$num]); } } private function save() { file_put_contents($this -> rname, implode("\r\n", $this -> result)); } } $parser = new parse; ?> <html> <title>Parse files</title> <body> <form method="POST" action ="<?php echo $_SERVER['PHP_SELF']; ?>"> <table> <tr> <td>Первый файл:</td><td><input name="file1" value="1.txt"></td><td>Cо строки:</td><td><input name="begin1" value="1"></td> </tr> <tr> <td>Второй файл:</td><td><input name="file2" value="2.txt"></td><td>Cо строки:</td><td><input name="begin2" value="1"></td> </tr> <tr> <td>Третий файл:</td><td><input name="file3" value="3.txt"></td><td>Cо строки:</td><td><input name="begin3" value="1"></td> </tr> <tr> <td>Четвертый файл:</td><td><input name="file4" value="4.txt"></td> </tr> <tr> <td>Сохранить в:</td><td><input name="rname" value="result.txt"></td> </tr> <tr> <td> <input type="submit" name="go" value="Start"> </td> </tr> </table> <?php if (isset($_POST['go'])) { $parser -> loadFile($_POST['file1']); $parser -> loadFile($_POST['file2']); $parser -> loadFile($_POST['file3']); $parser -> loadFile($_POST['file4']); $parser -> setBegin(0, $_POST['begin1']); $parser -> setBegin(1, $_POST['begin2']); $parser -> setBegin(2, $_POST['begin3']); $parser -> setRname($_POST['rname']); $parser -> run(); } ?>
...и чтобы в процессе написания не по коду туда сюда не бегать - например метод save который состоит из одной функции. Чтобы не думать на этом месте, что нужно будет сделать при сохранении. Пишу по-ходу исполнения так сказать.
[vs] Ты меня убил Это хорошо и замечательно, когда ты делаешь CMS или компонент, или там еще что-то... Но для простого утилитного скрипта... Так можно и аякс навесить, да скины, да добавить шаблонизацию(угу, Смарти незабвенный подключить).... Я сам часто спотыкаюсь на чрезмерном усложнении простых вещей... Но ты меня превзошел... P.S. ты обещал код не показывать, пока не оплатят.
Ну вот и сравни читабельность двух подходов. Оккама на вас не хватает... Надо, пожалуй, запретить читать Фаулера без прочтения Оккама.
Комрады программисты, если не спиться можете помочь) А то VS спать завалился) 1) Дело такое, не чередуется почему то, ну то есть например в первом файле всего две строчки так он вписывает первую, и потом вторую,вторую,вторую и так во всех файлах то есть заканчивается например в третьем файле строчки а скрипт еще работает, так он вписывает последнюю на которой строчки кончились, думаю понятно^^ Можете подправить чтобы если строчки заканчиваются возвращалось на 1 строчку (в файле) и по порядку шло и если опять доходило до конца опять на первую и поехали) Есть 5$ понимаю что мелочь, но больше нет) И П.С.Ы Есть у когонить скрипт, который генерировал бы строчки вида: Моеназвание000 Моеназвание001 Моеназвание002 И тд..
Realman Число строк в первых 3х файлах у тебя одинаково? Если да, то возьми мой код, забей имена файлов вместо CONST в 28й строке вбей нужный тебе постоянный текст. А как vs появится, так и будешь с ним разбираться с его скриптом. PHP: <form action="" method="post"> <input type="text" name="start"> <input type="submit" name="submit"> </form> <?php error_reporting(E_ALL | E_STRICT); $fn1 = '1.txt'; $fn2 = '2.txt'; $fn3 = '3.txt'; $fn4 = '4.txt'; if (isset($_POST['submit'])) { $start = abs((int) $_POST['start']); $fa1 = file($fn1,FILE_IGNORE_NEW_LINES); $fa2 = file($fn2,FILE_IGNORE_NEW_LINES); $fa3 = file($fn3,FILE_IGNORE_NEW_LINES); $fa4 = file($fn4,FILE_IGNORE_NEW_LINES); $c = count($fa1); if ($c != count($fa2) || $c != count($fa3)) { die('Число строк в файлах 1,2,3 не совпадает'); } if ($start > $c || $start == 0) { $start=1; } $res = array(); foreach ($fa4 as $val) { $res[] = $fa1[$start-1] . '|' . $fa2[$start-1] . '|' . $fa3[$start-1] . '|CONST||||' . $val . '|http://' . $val; $start++; if ($start > $c) { $start=1; } } file_put_contents('result.txt',implode("\r\n", $res)); } die();
К сожалению нет, В первом пока 2 (может потом еще добавлю) , во втором около 2500 и в третьем около 300.
Мда, переводил указатель массива вперед даже если элемент был последним - неправильно. Правильный код: PHP: <?php class parse { const POSTOYANNAYA = 'adult_ru|||'; private $files = array(); private $beginfrom = array(1 => null, 2 => null, 3 => null, 4 => null); private $errors = array(); private $result = array(); public $rname = null; public function loadFile($fname) { if (is_readable($fname)) { array_push($this -> files, file($fname, FILE_IGNORE_NEW_LINES)); } else { $this -> errors[] = 'File "'.$fname.'" is a not readable.'; } } public function setRname($name) { if (empty($name)) { $this -> errors[] = 'Incorrect name for result file.'; } else { $this -> rname = $name; } } public function setBegin($fnum, $val) { if (!is_numeric($val)) { $this -> errors[] = 'Inccorect line number at file #'.$fnum.'.'; } elseif (count($this -> files[$fnum]) < $val) { $this -> errors[] = 'Line #'.$val.' not found in the file #'.$fnum.'.'; } else { $this -> beginfrom[$fnum] = $val; } } public function run() { if (!empty($this -> errors)) { echo "<pre>Errors:\r\n"; print_r($this -> errors); echo '</pre>'; return 0; } else { end($this -> files[0]); end($this -> files[1]); end($this -> files[2]); $last0 = key($this -> files[0]); $last1 = key($this -> files[1]); $last2 = key($this -> files[2]); $this -> begin(0); $this -> begin(1); $this -> begin(2); reset($this -> files[3]); foreach($this -> files[3] as $string) { $buffer = null; $curr0 = current($this -> files[0]); $curr1 = current($this -> files[1]); $curr2 = current($this -> files[2]); $buffer = $curr0.'|'.$curr1.'|'.$curr2.'|'.self::POSTOYANNAYA.'|'.$string.'|http://'.$string; if (key($this -> files[0]) === $last0) { $this -> begin(0); } else { next($this -> files[0]); } if (key($this -> files[1]) === $last1) { $this -> begin(1); } else { next($this -> files[1]); } if (key($this -> files[2]) === $last2) { $this -> begin(2); } else { next($this -> files[2]); } array_push($this -> result, $buffer); } echo '<b>Result file: <a href="'.$this -> rname.'" target="_blank">'.$this -> rname.'</a></b>'; $this -> save(); } } private function begin($num) { reset($this -> files[$num]); for($i = 1; $i < $this -> beginfrom[$num]; $i++) { next($this -> files[$num]); } } private function save() { file_put_contents($this -> rname, implode("\r\n", $this -> result)); } } $parser = new parse; ?> <html> <title>Parse files</title> <body> <form method="POST" action ="<?php echo $_SERVER['PHP_SELF']; ?>"> <table> <tr> <td>Первый файл:</td><td><input name="file1" value="1.txt"></td><td>Cо строки:</td><td><input name="begin1" value="1"></td> </tr> <tr> <td>Второй файл:</td><td><input name="file2" value="2.txt"></td><td>Cо строки:</td><td><input name="begin2" value="1"></td> </tr> <tr> <td>Третий файл:</td><td><input name="file3" value="3.txt"></td><td>Cо строки:</td><td><input name="begin3" value="1"></td> </tr> <tr> <td>Четвертый файл:</td><td><input name="file4" value="4.txt"></td> </tr> <tr> <td>Сохранить в:</td><td><input name="rname" value="result.txt"></td> </tr> <tr> <td> <input type="submit" name="go" value="Start"> </td> </tr> </table> <?php if (isset($_POST['go'])) { $parser -> loadFile($_POST['file1']); $parser -> loadFile($_POST['file2']); $parser -> loadFile($_POST['file3']); $parser -> loadFile($_POST['file4']); $parser -> setBegin(0, $_POST['begin1']); $parser -> setBegin(1, $_POST['begin2']); $parser -> setBegin(2, $_POST['begin3']); $parser -> setRname($_POST['rname']); $parser -> run(); } ?>
Я как то умудрился) Вроде все ок, только вот сделать бы чтобы не на указанную в начале строчку возвращался если заканчивается, а на первую срочку в файле)
Осталась одна проблемка) Файлы пофиг руками посижу составлю) Открываю результат в firefoxe, ишаке и нотепадом везде результат один и тот же строчки сбиваются, то есть вид такой: one1 |Content8 |kluch9 |adult_ru||||qwe |http://qwe one1 |Content8 |kluch9 |adult_ru||||qwe |http://qwe а не как надо: one1|Content8|kluch9|adult_ru||||qwe|http://qwe one1|Content8|kluch9|adult_ru||||qwe|http://qwe
Эээ .. сообщение выше прочитал такую фигню, решил её наговнокодить: PHP: <?php // Постоянное количество цифр $idiot['const'] = 3; // Количество результатирующих строк $idiot['strings'] = 100; // Обработка $result = array(); for($j = 0; $j < $idiot['strings']; $j++) { if(strlen($j) < $idiot['const']) { $result[$j] = str_repeat('0', $idiot['const'] - strlen($j+1)); } isset($result[$j]) ? $result[$j] .= $j+1 : $result[$j] = $j+1; } // Вывести результат строкой echo implode('<br />', $result); ?>
Воо, пофиксил: PHP: <?php // Постоянное количество цифр $idiot['const'] = 3; // Количество результатирующих строк $idiot['strings'] = 100; // Префикс $idiot['text'] = 'PREFIX__'; // Обработка $result = array(); for($j = 0; $j < $idiot['strings']; $j++) { $result[$j] = $idiot['text']; if(strlen($j) < $idiot['const']) { $result[$j] .= str_repeat('0', $idiot['const'] - strlen($j+1)).($j+1); } else $result[$j] .= $j+1; } // Вывести результат строкой echo implode('<br />', $result); ?>