0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 33
1

Мини-бд в текстовом файле

24.04.2014, 13:15. Показов 1273. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Итак, есть собственно файл такой структуры:
1;Login;Password;IP
2;Login2;Password2;IP

Я её преспокойно парсю, сделал даже постраничную навигацию.
Теперь столкнулся с проблемой - как мне ещё прикрутить поиск.
Т.е. если мне известен один из параметров, то вернуть массив ТОЛЬКО со строками, которые содержат данный параметр.
Пробовал писать функцию:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function GetAllBy($what, $lines){
    foreach($lines as $line){
        $params = explode(";", $line);
        $key = array_search($what, $lines);
        if(in_array($what, $params)){
            foreach($params as $param){
                unset($lines[$key]);
            }
        }else{
            
        }
    }
    return $lines;
}
Чушь полная, знаю.
Но мне надо так, чтобы принимала $what - т.е. известный параметр и линии ($lines), возвращала массив $lines без тех строк, где не найдено в параметрах известного ($what).
Пробовал, пробовал, действительно старался, не вышло.
Помогите, пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2014, 13:15
Ответы с готовыми решениями:

Мини БД в текстовом файле
есть файл логин и пароль нужно сделать авторизацию и вывод на экран (форму для ввода логина и...

Отзывы в текстовом файле
Здравствуйте. Прошу помочь с отзывами с сохранением в текстовый файл. Прикрепляю файл как должно...

в текстовом файле 25 чисел
1)в текстовом файле 25 числе они все с новой строки, считать этот файл и записать в другой эти...

Удаление в текстовом файле
Здравствуйте. Установлен сервер в Windows, нужно скриптом найти и удалить строку в текстовом файле....

14
0 / 0 / 3
Регистрация: 15.04.2014
Сообщений: 100
24.04.2014, 13:16 2
Присоединяюсь
0
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
24.04.2014, 13:26 3
все зависит от размера файла, если он не слишком большой, проще считать всю инфу из него и потом выполнять действия: разделить строку на массив строк, и в каждой искать совпадения, если его нет, то удалять из массива
0
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 33
24.04.2014, 13:29  [ТС] 4
Йо, я так и делаю
Я попросил только функцию удаления лишнего, а насчет совета вашего - у меня и так файл в начале скрипта считывается в строку. Вы можете помочь с непосредственным вопросом?
0
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
24.04.2014, 13:36 5
не совсем понял ваш код, допустим lines- это то, что вы считали из файла, тогда
PHP
1
2
3
4
5
6
7
8
9
function GetAllBy($what, $lines){
//разделяем текст на строки, у вас разделитель ;
  $params = explode(";", $lines);
  foreach($params as $key=>$value){
      //если в строке нету элемента $what, то удаляем
     if(strpos($what,$value)==FALSE)
         unset($params[$key);
  }
}
в итоге в массиве params то что нам нужно
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 13:41 6
Наверное только не хватает цикла для перебора строк
PHP
1
2
3
4
5
foreach($lines as $line)
{  
    $params = explode(";", $line);
    // далее ваш цикл поиска
}
0
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 33
24.04.2014, 13:53  [ТС] 7
Цитата Сообщение от V@D!k Посмотреть сообщение
не совсем понял ваш код, допустим lines- это то, что вы считали из файла, тогда
PHP
1
2
3
4
5
6
7
8
9
function GetAllBy($what, $lines){
//разделяем текст на строки, у вас разделитель ;
  $params = explode(";", $lines);
  foreach($params as $key=>$value){
      //если в строке нету элемента $what, то удаляем
     if(strpos($what,$value)==FALSE)
         unset($params[$key);
  }
}
в итоге в массиве params то что нам нужно
Спасибо конечно, но вот что я перекляпал
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function GetAllBy($what){
    global $lines;
    $linii = $lines;
    //разделяем текст на строки, у вас разделитель ;
    foreach($linii as $indexline=>$line){
        $params = explode(";", $line);
        foreach($params as $key=>$value){
            //если в строке нету элемента $what, то удаляем
            if(!preg_match("/^{$what}/",$value)){
                unset($linii[$indexline]);
            }
        }
    }
    return $linii;
}
А как сделать чтобы он искал примерное вхождение в строку?
0
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
24.04.2014, 13:58 8
Лучший ответ Сообщение было отмечено XuPoH как решение

Решение

что значит
Цитата Сообщение от XuPoH Посмотреть сообщение
примерное
??
я вам написал как искать подстроку в строке, типа у вас строка блабладлабла, ищем дла, если оно есть ничего не делаем, если нету удаляем эту строку
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 14:32 9
XuPoH,
А чем вас вариант со вторым параметром $lines не устроил? Обычно стараются избегать глобальных переменных.
Лучше вам использовать следующий код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function GetAllBy($what, $lines){
    // Переменная для строк с нужным значением
    $foundLines = array();
    // Перебираем строки
    foreach($lines as $line){
        // Разбиваем строку на значения
        $params = explode(";", $line);
        // Перебираем значения
        foreach($params as $param){
            // Если в строке ЕСТЬ элемента $what, то добавляем строку в найденные
            if(preg_match("/^{$what}/",$param)){
                foundLines[] = $line;
            }
        }
    }
    return $foundLines;
}
Таким образом, мы избавились от глобальной переменной, не используем не нужные индексы в циклах, улучшили читаемость кода.
0
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 33
24.04.2014, 14:48  [ТС] 10
Цитата Сообщение от MasSakrA Посмотреть сообщение
XuPoH,
А чем вас вариант со вторым параметром $lines не устроил? Обычно стараются избегать глобальных переменных.
Лучше вам использовать следующий код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function GetAllBy($what, $lines){
    // Переменная для строк с нужным значением
    $foundLines = array();
    // Перебираем строки
    foreach($lines as $line){
        // Разбиваем строку на значения
        $params = explode(";", $line);
 
        foreach($params as $param){
            if(preg_match("/^{$what}/",$param)){
                foundLines[] = $line;
            }
        }
    }
    return $foundLines;
}
Таким образом, мы избавились от глобальной переменной, не используем не нужные индексы в циклах, улучшили читаемость кода.
Бяка.

p.s.
Можете закрывать тему, вот что я накуролесил:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function GetAllBy($what){
    global $lines;
    $linii = $lines;
    $result = array();
    foreach($linii as $indexline=>$line){
        $params = explode(";", $line);
        foreach($params as $index=>$param){
            if(preg_match("/{$what}/i", $param)==TRUE){
                $result[$indexline] = $line;
            }
        }
    }
    return $result;
}
0
2 / 2 / 0
Регистрация: 17.06.2011
Сообщений: 56
24.04.2014, 15:48 11
По мне дак лучше используйте json, по нему легко настроить поиск и импортировать его на сайт.
0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 16:05 12
XuPoH, а можно подробней на счёт "бяки", что именно смущает (кроме синтаксической ошибки в виде пропущенного доллара - спешил)?

И ещё
Цитата Сообщение от XuPoH Посмотреть сообщение
$result[$indexline] = $line;
может вернуть вам массив с индексами 3, 7, 8, 12, например. Лучше не указывать явно индекс
$result[] = $line; тогда индекс будет идти по порядку

Добавлено через 1 минуту
Цитата Сообщение от qwili Посмотреть сообщение
По мне дак лучше используйте json, по нему легко настроить поиск и импортировать его на сайт.
Что имеете в виду под "используйте json", учитывая что речь идёт о чтении файла?
0
2 / 2 / 0
Регистрация: 17.06.2011
Сообщений: 56
24.04.2014, 16:21 13
А в чём проблемы? За место .txt файла создайте .json и работайте напрямую с массивом

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "data": [
        {
            "Login": "name1",
            "Password": "pass1",
            "IP": "127.0.0.1"
        },
        {
            "Login": "name2",
            "Password": "pass2",
            "IP": "127.0.0.2"
        },
        {
            "Login": "name3",
            "Password": "pass2",
            "IP": "127.0.0.3"
        }
    ]
}
PHP
1
2
3
4
5
6
7
8
$jsonAccount = file_get_contents("site.ru/data.json");
$AccountBuf = json_decode($jsonAccount);
 
$User1_Name = $AccountBuf->data[0]->Login;
$User1_Password = $AccountBuf->data[0]->Password;
$User1_IP = $AccountBuf->data[0]->IP;
 
echo 'Логин пользователя: '.$User1_Name.'<br>Пароль пользователя: '.$User1_Password.'<br>IP пользователя: '.$User1_IP;
0
crautcher
24.04.2014, 17:15
  #14

Не по теме:

Цитата Сообщение от qwili Посмотреть сообщение
За место .txt файла создайте .json и работайте напрямую с массивом
Тогда уже можно и файл sqlite создать и запросами вытягивать как и в mysql

0
0 / 0 / 0
Регистрация: 24.04.2014
Сообщений: 6
24.04.2014, 17:22 15
Проблем нет, просто не понял, что вы имели в виду под словом "используйте json". Это подходит, если автор сам создаёт этот файл, а если его ему присылают, или он его берёт с ftp или ещё откуда, то нет выбора, нужно парсить как есть. С форматом json, хоть файл и больше места будет занимать, работать не только удобнее, но можно ещё и более сложные структуры данных организовывать. По хорошему, для более сложной структуры можно уже и, например, SQLite использовать.
0
24.04.2014, 17:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2014, 17:22
Помогаю со студенческими работами здесь

Поиск в текстовом файле на PHP
Имеется текстовый файл &quot;Rezalt&quot; в который записывается Имя и номер телефона через запятую и...

Сохранение данных в текстовом файле
Народ нужно не большая помощь тут имеется код ... нужно сделать форму на подобие регистрации и...

Количество предложений в текстовом файле
Составить программу, которая подсчитывает количество предложений в текстовом файле. каждое...

Сортировка строк в текстовом файле по дате
Здравствуйте, как можно сделать сортировку по дате рождения вида дд-мм-гг, догадываюсь, что нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru