Здравствуйте, пишу код который ищет слово(ник) в txt файле и меняет его число. Ник найти не сложно, но нужно отступить от ника три знака ||| и добраться до цифр содержимое 1.txt (строк много, файл может достигать более 10 мб) Код (Text): User|Moskva|mail|20 Vlad|Moskva|mail|20 Vadim|Moskva|mail|54 и тд вывести число могу, но нужно его изменить, то есть прибавлять 20. Кратко: -Найти ник(у него 10 например), к его сумме прибавить 20, и удалить старое число т.е 10 и записать вместо него новую сумму 30 Вот код, помог AlexandrS: PHP: $var = "User"; $arrayDump = file("./1.txt", FILE_IGNORE_NEW_LINES); foreach ($arrayDump as $strDump) { list($name, $sit, $mail, $nm) = explode("|", $strDump); if (trim($name) == trim($var)) { echo "$nm"; } как после условия на идентичность ника, перепрыгнуть через 3 знака ||| и сложить так как писал выше? explode не нужен наверное предпологаю, т.к нужно по знакам | ориентироваться
а условие на идентичность ника по твоему это: ?? Кликни на trim в своём коде, и почитай, что он делает) почитай про list и explode таким же способом. --- Добавлено --- сорирую, перепутал идентичность с уникальностью) --- Добавлено --- но это: актуально
@Fox- , вам случаем структура данных в текстовом файле не напоминает CSV? Я бы пригляделся к этому. Может и задачка показалась бы простой...
бывает. Прочел, норм. Знаете как осуществить? Найти ник и прибавить к числу --- Добавлено --- Она и есть в принципе,вы на работу с str_getcsv намекаете? нужно банально найдя ник, сложить числа и сохранить ответ вместо старого, перерыл гугля, но мало полезного нашел, я сам написал бы, но не красиво получается пока. А некоторые действия попросту не смогу написать
структуру данных изменить пришлось, теперь данные так выглядят Код (Text): User|<User>50</User> Vlad|<Vlad>21</Vlad> Vadim|<Vadim>20</Vadim> иначе, если как в первом варианте через | не знаю как. С тегами удобнее работать Жду может кто-нибудь знает, как через три ||| все таки перепрыгнуть и число прибавить и тд Вопрос открыт )
Давайте так попробуем: PHP: <?php function replace_number($arr, $name, $num = 20){ $re = '/(^'.$name.'\|[^|]+\|[^|]+\|)(\d+)$/'; foreach($arr as &$line) { $line = preg_replace_callback($re, function($m) use($num){ return $m[1] . ($m[2] + $num); }, $line); } return $arr; } $data = [ 'User|Moskva|mail|20', 'Vlad|Moskva|mail|20', 'Vadim|Moskva|mail|54' ]; print_r(replace_number($data, 'Vlad')); /* Array ( [0] => User|Moskva|mail|20 [1] => Vlad|Moskva|mail|40 [2] => Vadim|Moskva|mail|54 ) */ print_r(replace_number($data, 'Vadim', 100)); /* Array ( [0] => User|Moskva|mail|20 [1] => Vlad|Moskva|mail|20 [2] => Vadim|Moskva|mail|154 ) */
@Deonis Все работает, спасибо, но когда данные с txt беру, не работает. PHP: <?php $name1="User"; //$num1000 = '1000'; $txt = file_get_contents('ok.txt'); function replace_number($arr, $name, $num = 20){ $re = '/(^'.$name.'\|[^|]+\|[^|]+\|)(\d+)$/'; foreach($arr as &$line) { $line = preg_replace_callback($re, function($m) use($num){ return $m[1] . ($m[2] + $num); }, $line); } return $arr; } print_r(replace_number($txt, $name1, 20)); ?> --- Добавлено --- Еще вопрос, в переменной число, как можно в txt файле его между тегом например <User></User> вставить, но перед этим удалив содержимое тега. И Сохранить измененный txt
В начале в вашем коде вы использовали функцию file(). Что изменилось с того момента? Регулярки и теги - понятия плохосовместимые. И у меня создалось впечатление, что вы постоянно пытаетесь усложнить задачу. ))
Да нет усложнить не пытаюсь) Хотел упростить, сейчас я с таким содержимым txt файла хочу попробовать разобраться: Код (Text): User|<User>50</User> Vlad|<Vlad>21</Vlad> Vadim|<Vadim>20</Vadim> , ваш код я не могу подкорректировать под себя ) то одна ошибка то вторая т.к. я любитель)) вот так решил попробовать Код (Text): $name="User"; $num20 = '20'; $txt = file_get_contents('ok.txt'); if(preg_match("~<$name>(.*)</$name>~",$txt,$preg)) $bln= $preg[1]; echo $bln; echo "<br/>\$num20 + \$bln = ". ($num20 + $bln); $newbln=($num20 + $bln); // итог, это число нужно расположить между тегов <User></User> перед этим удалив содержимое тега.в txt файле ok.txt
может ты бы всё таки почитал про explode() и осознал бы наконец, что он разбивает строку на массив по указанному разделителю. И тогда бы ты понял, что прыгать то и не нужно. Нужно просто брать элементы массива и засовывать куда тебе надо.
Или preg_split, или уже полностью привести формат данных к XML, а не делать гибрид из CSV и XML, или вообще использовать БД. Кстати, почему файл, а не база?
@TeslaFeo в последнем варианте не нужен мне explode(), я разбивал строку на подстроку и заносил каждую подстроку в переменную, и даже explode использовал, но сейчас другой код пишу. Вы коментарии не прочли к коду выше в конце Код (Text): $newbln=($num20 + $bln); // итог, это число нужно расположить между тегов <User></User> перед этим удалив содержимое тега.в txt файле ok.txt --- Добавлено --- вроде просто, но не получается )
я набросал код(выше), который заносит в переменную число между <User></User> и суммирование выполняет +20. Полученный ответ уже есть, его нужно в теги вставить, удалив старое число. Сейчас следующее выполнить нужно : 1) удаляем данные в txt между тегами <User></User> 2)Сохраняем txt с свободным тегом без данных, иначе нужно строку с этим тэгом всю заменять- это не удобно 3)И вставляем ответ в txt между свободными тегами <User></User> Если не сложно покажите как это осуществить ? С комментариями, если можно )))
фух... придумал,написал так Код (Text): $str = file_get_contents ( 'ok.txt' ); $str = str_replace ( '<'.$name.'>'.$b.'</'.$name.'>', '<'.$name.'>'.$newb.'</'.$name.'>', $str ); file_put_contents ( 'ok.txt', $str );
Беспокоит вопрос, слышал, что при одновременной записи данных в txt фаил несколькими пользов-ми, данные в txt могут стираться, ошибки могут быть, это правда?
открываешь файл, в цикле пытаешься сделать блокировку. если блокировка успешная - почитал-записал, снял блокировку, умер. Если блокировка не успешная - немного поспать и ещё раз попробовать заблокировать. Если число попыток блокировки превысило разумный предел - тут уже по ситуации: вэб закончишь ответом ошибкой, а даемон же может и ещё немного потыркаться в блокировку. Главное селать неблокирующую блокировку, а то заблокируешь выполнение скрипта до успешной блокировки.