|
|
|
| Всем привет!
Имеется файл users.dat следующей структуры:
Так же имеется скрипт, который считывает все строки файла users.dat в массив вида:
array(строка1, строка2, строка3, строка4, ..., строкаN)
|
Т.е. получается, что в каждом элементе массива хранится весь набор полей записи в виде строки с разделителями..
Но меня такой вид не устраивает и я бы хотел чтобы скрипт из каждой строки файла создавал отдельный объект и возвращал массив объектов.
array([[0]=>$obj1, [1]=>$obj3, [2]=>$obj3, ..., [n]=>$objN)
|
В принципе, я могу сделать это и сам, но у меня пока еще не всегда получается писать короткий и красивы код. Потому решил попросить помощи тут...
У меня есть одна идея, но до конца я ее не могу продумать...
предполагаю создать такой класс:
class Users {
public $_name;
public $_login;
public $_email;
public $_password;
}
|
и использовать его, но как именно - пока не придумал...
у кого какие идеи? | |
|
|
|
|
|
|
|
для: alba
(29.11.2008 в 12:07)
| | Чем вас двумерный ассоциативный массив не устраивает? | |
|
|
|
|
|
|
|
для: Valick
(29.11.2008 в 12:14)
| | да можно и двумерный массив...
тогда просто скажите как без лишних присваиваний и итераций сделать ассоциативный массив с "правильными" индексами...
но вообще я хочу сделать массив объектов.... :) | |
|
|
|
|
|
|
|
для: Alba
(29.11.2008 в 12:24)
| | А файл большой? | |
|
|
|
|
|
|
|
для: Valick
(29.11.2008 в 13:09)
| | именно этот файл не большой...
но я хочу использовать один шаблон для многих файлов...
т.е. в данном случае в файле лежат всве юзеры сайта, в другом случае может быть список товаров... короче файл может быть как большим, так и маленьким... | |
|
|
|
|
|
|
|
для: Alba
(29.11.2008 в 12:24)
| | Если маленький, то примерно так:
<?php
// Открываем файл если он существует
if(file_exists($file))
{
$f=fopen($file, "r+t") or die("Невозможно открыть файл");
// Блокируем файл (разделяемая блокировка)
flock($f, LOCK_SH); // ждём завершения процесса записи
// В файл теперь никто не пишет, можно читать
$cont=explode("\n",fread($f,filesize($file))); // считываем файл
fclose($f); // закрываем файл
// Обрабатываем массив "без лишних итераций" :)
foreach($cont as $key=>$value)
{
res=explode(" ",$value);
mass[$key]['name']=res[0];
mass[$key]['login']=res[1];
mass[$key]['email']=res[2];
mass[$key]['password']=res[3];
}
}
else
{
$cont="Файл не существует";
}
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(29.11.2008 в 13:24)
| | спасибо, может воспользуюсь этим вариантом если мой не получится...
а если получится я его сюда кину...
в принципе почти все готово у меня, но возникают некоторые трудности, по поводу одной из них я создал еще одну тему... :) | |
|
|
|
|
 33.6 Кб |
|
|
для: Alba
(29.11.2008 в 17:42)
| | все, сделал как хотелось...
в аттаче архив, оцените пожалуйста степень "кривизны рук" :)
замысел такой: пытаюсь сделать класс для работы с файлами, чтобы использовать его потом на сайтах без MySQL и т.п. Основной акцент сделан на то чтобы обеспечить сохранность файлов данных при обращении к одним и темже файлам нескольких пользователей...
Принцип действия такой: когда скрипт обращается к какому-нибудь файлу 'somefile.ext', то в некоторой временной папке создается пустой файл 'somefile.ext.tmp' и пока он существует, к файлу родителю 'somefile.ext' нельзя обратиться... как только скрипт закончил работу с файлом 'somefile.ext', его временная копия 'somefile.ext.tmp' удаляется и скрипты снова могут работать с файлом 'somefile.ext'...
:) надеюсь не запутал никого...
но мне сейчас интересно Ваше мнение о том как я реализовал функцию objFileArray('filename', 'classname').
эта функция считывает файл filename и каждую строку этого файла преобразует в объект класса classname и возвращает массив объектов данного класса...
кто что скажет по этому поводу? может это можно сделать как-нибудь побыстрее, поинтереснее... | |
|
|
|
|
|
|
|
для: Alba
(29.11.2008 в 21:30)
| | Основной акцент сделан на то чтобы обеспечить сохранность файлов данных при обращении к одним и темже файлам нескольких пользователей...
для этого придумали блокировку файлов. | |
|
|
|
|
|
|
|
для: Valick
(29.11.2008 в 21:39)
| | это я знаю... просто при определенных обстоятельствах она не спасает... | |
|
|
|
|
|
|
|
для: Alba
(29.11.2008 в 21:45)
| | это каких же обстоятельствах?
кстати у вас никаких блокировок нет... | |
|
|
|
|
|
|
|
для: Valick
(29.11.2008 в 21:52)
| | не то хотел сказать.... просто помоему flock слишком замороченная функция...
мне кажется так как сделал я - проще, тем более что это не моя личная идея...
http://omsk777.ru/all.php?act=block
а вообще мне было бы инетеснее услышать что-либо по поводу ф-ии objFileArray
вот еще по flock http://omsk777.ru/all.php?act=flock | |
|
|
|
|
|
|
|
для: Alba
(29.11.2008 в 21:56)
| | глупости... авторам этой писанины не мешало-бы мат часть поучить (и вам тоже) и правильно применять блокировку. выкинуть из кода все @ и уж точно не использовать
("file_base.dat", "w")
а вообще мне было бы инетеснее услышать что-либо по поводу ф-ии objFileArray
а что вы хотите услышать?
вы обернули стандартные функции работы с файлами в какие-то классы и всё.
я так и не понял каким образом увас происходит блокировка? | |
|
|
|
|
|
|
|
для: Valick
(29.11.2008 в 22:23)
| | > и уж точно не использовать ("file_base.dat", "w")
а здесь что не так?
>а что вы хотите услышать?
услышать бы хотелось мнение по поводу "оптимальности" реализации разбора файла... может есть более быстрые способы?
>я так и не понял каким образом увас происходит блокировка?
по сути как таковой блокировки файла не происходит... просто при открытии файла функцией OpenFile делается проверка на существование временной копии открываемого файла... если копия существует, значит файл "занят" и функция ожидает пока он не освободится.... как только файл освободился, его копия удаляется (ф-я CloseFile) и ожидающий скрипт приступает к обработке освободившегося файла по той же схеме... т.е. создает временную копию файла - признак того что файл занят, затем обрабатывает файл, и как только закончил обработку удаляет временную копию файла, тем самым сообщая всем что файл свободен...
ps: я два года не занимался php, сейчас решил начать изучение php5 практически с нуля, поэтому глупостей со своей стороны избежать не могу... звеняйте... | |
|
|
|
|
|
|
|
для: Alba
(30.11.2008 в 08:27)
| | а здесь что не так?
а то что между открытием файла fopen и блокировкой файла, есть промежуток времени в который может вклиниться другой процесс. ("file_base.dat", "w") по сути изменяет (очищает) файл, чего категорически нельзя делать до его блокировки. Вообще проще отказаться от w и w+, потому как его грамотное применение требуется крайне редко. Надёжнее очищать файл вручную уже после блокировки файла.
При работе с блокировкой есть подводные камни, но все они уже давно известны и описаны (например у Д.Котерова "РНР5"). Просто нужно использовать нужную блокировку в нужное время. | |
|
|
|
|
|
|
|
для: Alba
(29.11.2008 в 21:56)
| | Как то в незапамятные времена, начитавшись подобного рода трактатов, пестрящие выражениями плана которую кладем в переменную , я испытал жуткий конфуз, когда сайт "залег" прямо во время демонстрации. Вообще с тех пор я пользуюсь функцией file_put_cоntents() Не знаю, на сколько это панацея, но у меня (тьфу, тьфу) пока проблем не возникало... | |
|
|
|