За последние 24 часа нас посетили 55129 программистов и 1777 роботов. Сейчас ищут 907 программистов ...

Работа с файлами

Тема в разделе "PHP для новичков", создана пользователем Taktreba, 6 апр 2017.

  1. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    Подскажите решение задачки на "пальцах" поэтапно... код сам набрасаю

    /*Дан файл. Каждая строка содержит имя, пароль и email, разделенные символами ':'
    (двоеточие).
    Например:
    john:12345: john@gmail.com
    kate:12345: kate@gmail.com
    test:21345: test@gmail.com
    mike:12145: test@gmail.com
    Удалить строки с повторами email и строки, в которых совпадают имена (т.е. удалится последняя строка).*/
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    1. Прочитать файл
    2. Разбить строки по двоеточиям
    3. Убрать дубли e-mail и дубли имён.
     
  3. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    сделать четыре массива по кол-ву строк? а как?
    я делал так, $arr = file(text.txt) потом форычем перебирал value и explod ом все разбивать, но если подготовить $users, то форыч перезаписывает все сверху и $users получает данные только последней строки...
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну я бы сделал просто.
    1. Создал второй временный файл
    2. Создал бы два массива - один для e-mail, другой для имён.
    3. Читал бы строки первого файла по одной, разбивал их по двоеточию
    4. Если ни имя ни e-mail из прочтённой строки не найдены в массиве, запихивал бы их туда, а строку бы записывал во временный файл.
    5. После всего процесса удалил бы первый файл, а свой второй временный бы переименовал.

    Кодь :)
     
    Taktreba нравится это.
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    т е если есть два одинаковых имени то удалить обе строки?
    --- Добавлено ---
    P. S. IMHO можно обойтись одним двумерным массивом.
    --- Добавлено ---
    Если, конечно, в файле не 100к строк.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А еще можно хранить все в XML или, еще лучше, в JSON или в native php, чтоб опкэшером жралось, и не придумывать велосипедных сериализаций.

    Про открытые пароли в хранилище такиично умолчим, но осуждающе нахмурим брови...
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Возможно это тестовое задание?
     
  8. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. // read all
    2. //$text = file_get_contents($file);
    3. $text = 'john:12345: john@gmail.com
    4. kate:12345: kate@gmail.com
    5. test:21345: test@gmail.com
    6. mike:12145: test@gmail.com';
    7.  
    8. $lines = explode(PHP_EOL, $text);
    9. $emails = [];
    10. foreach($lines as $line){
    11.     list($user, $num, $email) = explode(":", $line);
    12.     $email = trim($email);
    13.     if(!isset($emails[$email])){
    14.         $emails[$email] = [$user, $num];
    15.     }
    16. }
    17. var_dump($emails);
    18.  
    19. // read by line
    20. $emails = [];
    21. $handle = fopen($file, "r");
    22. while($line = fgets($handle)){
    23.     list($user, $num, $email) = explode(":", $line);
    24.     $email = trim($email);
    25.     if(!isset($emails[$email])){
    26.         $emails[$email] = [$user, $num];
    27.     }
    28. }
    29. fclose($handle);
    30. var_dump($emails);
    Второе не тестировал, но должно работать.
     
    mahmuzar нравится это.
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @Abyss ТС всегда просит, чтобы ему не давали готовое решение)
     
    denis01 нравится это.
  10. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    @TeslaFeo и что теперь ?

    Я не знаю, попадает ли под NDA описание ацаца в моей текущей конторе ? Ну вообщем тут такая же история, при учете 5ти летнего легаси.
     
  11. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    очень странный ответ. Ощущение какой-то скрытой агрессии.
    по моим расчетам эта фраза предельно ясная и не требует дополнительных комментариев.