Така как може да стане това...

HunteR

Super Moderator
Така имам един файл и в него са записвани следните работи:
Код:
HunteR|43278484
Master|43534554
viki|85549329
weti|32343435
Така това в ляво са имената на потребителите, а в дясно времето през, което са били последно Онлайн.
Значи искам да направя следното нещо.
Истинския час да се извади от часа на потребителя и ако той е по-малък от 60 да го изакра заедно със другите потребители, но ако е по голям значи потребителя е оффлайн да не го изкарва!

Искам потребителите да се разделят със запетая например HunteR,Master и т.н.
Дано сте ме разбрали

А и също когато потребителя е в сайта и нещо прави да му се записва новото време, последно когато е бил в сайта ;)

Иначе аз все още го нямам този файл, но вие ще ми помогнете надявам се :)
 
Защо не го направиш с база данни, а не с такива файлове? Така само се затормозяваш :?

Иначе по въпроса ти аз лично не мога да отговоря. С база данни бих измисл нещо, но ще стане чак за другата седмица... :oops:
 
Относно изкарването на потребителите.
Бях ти дал някъде един код в една твоя минала тема.
Пак взимаш стойностите на потребителите в array.
Това второто предполагам е timestamp ?
Взимаш и time();
даваш
for($i = 0; $i < $n; ++$i){
$razlika = time () - $line[$i][1];
if ($razlika <= 60){
echo $line[$][0].", ";
}
}
и така изкарваш потребителите.

Не мога да ти помогна повече, тъй като в момента нямам localhost ;)

П.С.
С файлове до никъде няма да стигнеш :wink:
 
Soul_Stealler каза:
Относно изкарването на потребителите.
Бях ти дал някъде един код в една твоя минала тема.
Пак взимаш стойностите на потребителите в array.
Това второто предполагам е timestamp ?
Взимаш и time();
даваш
for($i = 0; $i < $n; ++$i){
$razlika = time () - $line[$i][1];
if ($razlika <= 60){
echo $line[$][0].", ";
}
}
и така изкарваш потребителите.

Не мога да ти помогна повече, тъй като в момента нямам localhost ;)

П.С.
С файлове до никъде няма да стигнеш :wink:
Това добре за изкарването на потребители, а как ще стане така записването!
Да гледа потребитела и да преправя чеса на посления, в който е бил?

Вече няма значение!
Аз се оправих ;)

Вместо да пускам нова тема ще попитам тук!

Значи имам следния файл:

Код:
HunteR|6
Master|5
viki|4
weti|7
Така искам да ги подрежда по-големина!
Значи първи да е weti, защото е с най-голямо число 7, втори HunteR, защото е с число 6!?
 
Здравей!

Бърз отговор (кодът в разлят запис):

<?
$fm=file("abc.txt");

$kolko=count(fm);

for ($i=0; $i<$kolko;$i++)
{
$pm=explode ("|",$fm[$i] );
$nik=$pm[0];
$indeks=$pm[1];
$finalen[$nik]="$indeks";
}

rsort($finalen);

while (list ($key, $value) = each ($finalen))
{
echo "Потребител: $key. Число: $value";
}
?>

Обяснението накратко:
Четеш съдържанието на файла с file(); - получаваш масива Фм - всеки ред - елемнт в масива.
Делиш редовете с explode(); по разделителя си - нов масив Пм - два елемента при всяка итерация (отброяване на цикъла) - името и числото от съответния ред - дотук е стандартно.
Тънкият момент:
От получените две променливи на всеки ред създаваме нов масив - $finalen, където:
числото - $indeks става елемент на масива!!!, а името - ключ. Така запазваме връзката име-число (двойката ключ-стойност) и можем спокойно да ги пренареждаме както решим.
В твоя случай искаш да са по низходящ ред, затова използваме функцията за пренареждане rsort();
Вече имаме елементите (с ключовете) им подредени и остава да ги листнем като обходим масива:
Фор-цикълът не е подходящ за обхождане ан масиви, за които не знаем как са индексирани, принципно е възможно да се измисли как да се приложи и тук, но ще е мъчнотия. В тези случаи по-подходящата конструкция си остава while(); - докато условието е вярно с Лист и Ейч обхождаме и листваме.

Вместо while() би могъл да използваш и foreach() - въпрос на предпочитания.
За пренареждане във възходящ ред на елементите функцията е sort();
За останалите функции за работа с масиви погледни уроците. Ако искаш да работиш с файлове без масиви няма как да се справиш, затова е важно да усвоиш операциите с тях. Понякога точно масивите ще те извадят от най-тежките ситуации в които можеш да изпаднеш и никакъв начин на организиране на записите няма да ти помогне да минеш без тях.

И един съвет, който сигурно няма да ти допадне, но ще подкрепя останалите, които ти казват, че с файлове е мъчнотия и че сериозно развитие без да усвоиш БД не можеш да постигнеш.
Както ми казваше Админ преди време, няма как да го разбереш докато не се сблъскаш с БД, а тогава всичко, което си постигнал с файловете ще е едно ненужно упражнение - ще разполагаш с хиляди редове вече неизползваем код и ще си пропилял ценно време...

Толкова. Дано съм помогнал.
Успех!
 
Така значи пиша това в една страница да пробвам

Код:
<? 
$fm=file("abc.txt"); 

$kolko=count(fm); 

for ($i=0; $i<$kolko;$i++) 
{ 
$pm=explode ("|",$fm[$i] ); 
$nik=$pm[0]; 
$indeks=$pm[1]; 
$finalen[$nik]="$indeks"; 
} 

rsort($finalen); 

while (list ($key, $value) = each ($finalen)) 
{ 
echo "Потребител: $key. Число: $value"; 
} 
?>
и сега създавам файл, който се казва abc.txt.
След, което вътре въвеждам някакви имена и отстани числа и ми изкарва Потребител: 0. Число: 8 каквото и да напиша само сменя числото защо така?
 
Здравей!

Извинявай, допуснал съм грешка (липсващ стринг при count(fm); и масива не се обхожда) , но генералния проблем е, че кода всъщност не беше дообмислен. Вярвах, че си правя застраховка с "тънкия момент", но съм се объркал още повече.
Имам решение, но то е частично - защо, ще видиш по-надолу:

<?
$fm=file("abc.txt");

$kolko=count($fm);

for ($i=0; $i<$kolko; $i++)
{
$pm=explode ("|",$fm[$i] );
$red=$pm[1];
$finalen_1[$i]=$red;
$finalen_2[$red]=$pm[0];
}

rsort($finalen_1);

for ($i=0; $i<$kolko; $i++)
{
$red=$finalen_1[$i];
echo "<BR>$finalen_1[$i] - $finalen_2[$red]";
}
?>

Тук се използват два масива - в първия финален попада числото, във втория - името като елемент и отново числото, но като ключ.
Сортираме първия масив - числата се подреждат.
В нов фор-цикъл обхождаме двата масива. От подредените елементи на първия - този с числата вземаме поредността по която ще листваме втория - с имената (числата като ключ към тях).
Двата масива работят чудесно, сортирането също.
При съдържание на файла:

HunteR|6
Master|5
viki|4
weti|7

тази конструкция ще се справи. НО ако файла изглежда така:

HunteR|6
Master|5
viki|4
weti|57

ще получиш различен резултат: 6, 57, 5, 4

Защо?

В първия код пропуснах да си спомня нещо важно за една от използваните функции или по-скоро спомних си го по по-удобния начин. Смятах, че като се създаде асоциативен масив проблема с резултата ще се реши.

Функциите sort(); и rsort(); работят с числово индексирани масиви и затова не запазват стойността на ключовете, така че първия код беше обречен, но това все още не е истинската грешка.
Двете функции имат аналог за асоциативни масиви (т.е. индексирани с низ): asort(); и arsort(); - те запазват стойността на ключа. Когато добавянето на $-га ми показа проблема, реших че само трябва да извърша сортирането с тях и след 1 мин ще съм забравил за този скрипт. Учудващо не получих очаквания резултат.

Сетих се за ksort(); и krsort(); - те сортират не по стойността на елементите, а по стойността на ключовете. Смених индексирането с числата, съответно елементите - името.
Също провал. :(

За да не тъпча темата с още приказки, проблема не е в сортирането, не и в масивите (опитах и с многомерен, индексиран всякак, с два отделни - горния код), а във функцията, с която делим реда - експлоуд дели НИЗОВЕ :(

Ако някой каже как се прави смяна на типа (нито с инт нито с интвал се получи?!), горния код ще работи.
Иначе както и да се индексира масива, както и да се сортира, щом числата са получени с делене на низ, ще се извършва сравняване на низове.

Не мисля, че смяната на explode(); със substr(); или strstr(); ще промени нещо.
Съжалявам :(
Ще го мисля, ако някой се сеща за друг начин - нека се включи...
______________

Едит, сгрешено име на променлива ми е пречела да сменя типа. Ето ти кода, напълно работещ:

<?
$fm=file("abc.txt");

$kolko=count($fm);

for ($i=0; $i<$kolko; $i++)
{
$pm=explode ("|",$fm[$i] );
$r=$pm[1];
$r2=intval($r);
$finalen_1[$i]=$r2;
$finalen_2[$r2]=$pm[0];
}

rsort($finalen_1);

for ($i=0; $i<$kolko; $i++)
{
$red=$finalen_1[$i];
echo "<BR>$finalen_1[$i] - $finalen_2[$red]";
}
?>
 
Да мерси този път наистина стана ;)
А как може например да се направи този код както искарва така хората да ги прави по 50 на страница?
 
Здравей!

Бях писал нещо подобно преди време, а на мен пък ми бяха помогнали със страницирането с масив, затова бързо мога да ти дам кода:

<?
$filelocation="/home/www/probna.awardspace.com/demo8/abc.txt";
$fm=file("$filelocation");


$broinastranica = 3;
$pageNum = 1;

if(isset($_GET['page']))
{
$pageNum =$_GET['page'];
$start = ($pageNum - 1) * $broinastranica;
}
else
{
$start=0;
}



$kolko=count ($fm);

for ($i=0; $i<$kolko; $i++)
{
$pm=explode ("|",$fm[$i] );
$r=$pm[1];
$r2=intval($r);
$finalen_1[$i]=$r2;
$finalen_2[$r2]=$pm[0];
}

rsort($finalen_1);

for($i = $start; $i < ($start+$broinastranica); $i++){
$red=$finalen_1[$i];
echo "<BR>$finalen_1[$i] - $finalen_2[$red]";
if ($i==$kolko) break;
}


$maxPage = ceil($kolko/$broinastranica);

$self = $_SERVER['PHP_SELF'];
$nomeranastranici = '';

for($page = 1; $page <= $maxPage; $page++)
{
if ($page == $pageNum)
{
$nomeranastranici .= " [$page] ";
}
else
{
$nomeranastranici .= " <a href=\"$self?page=$page\" >$page</a> ";
}
}

if ($pageNum > 1)
{
$page = $pageNum - 1;
$predishna = " <a href=\"$self?page=$page\" TITLE=\"Назад\"> <<</a> ";

$parva = " <a href=\"$self?page=1\">ПЪРВА</a> ";
}
else
{
$predishna = ' ';
$parva = ' ';
}

if ($pageNum < $maxPage)
{
$page = $pageNum + 1;
$sledvashta = " <a href=\"$self?page=$page\" TITLE=\"Напред\"> >></a> ";

$posledna = " <a href=\"$self?page=$maxPage\" >ПОСЛЕДНА</a> ";
}
else
{
$sledvashta = ' ';
$posledna = ' ';
}

echo $parva . $predishna . $nomeranastranici . $sledvashta . $posledna;
?>

Ето и демо:
http://probna.awardspace.com/demo8/list.php

Бтроя на резултатите промени от $broinastranica.

Има нещо, което е добре да имаш предвид с това странициране (писал съм, какви ли не вариации по него, но когато го сравня със странициране на резултати от БД недостатъците му лъсват веднага):

Файлът се чете при всяка страница отначало, промяната е само в позицията от която се обхожда получения масив. Това значи, че колкото по-голям е файла, толкова по-бавно ще се изпълнява кода.

В твоя случай има още едно утежнение - не само че четем файла всеки път, но имаме и пълно обхождане и делене на основния масив преди сортирането и това няма как да се избегне защото резултатите ти са неподредени и още на първа страница може да се наложи листване на име, което се намира на последния ред във файла.

Другото, което би могло да доведе до неточност (и без страницирането) е повторение на някое от числата според което се определя подреждането.
Проблема е в алгоритъма - сортираме само единия масив и го ползваме за ключ към втория. Тук първоначалното хрумване с асоциативния масив беше по-удачно.

Ако кажеш за какво ще използваш кода и как правиш записите във файла, може би бих могъл да измисля по-удачно решение съобразено с целия процес, а и другите навярно биха се включили с идеи, защото от постовете ти виждам, че няколко души тук пишем код на парче, което понякога може да бъде доста изнервящо...

Позволявам си всичките тези дълги обяснения не за да те назидвам, а за да те откажа от файловете. Не става, не е начина - повярвай ми!
Проблема с БД е психологически - не го твърдя само аз.
Бях фанатик на тема файлове, но операциите с тях изкривяват мисленето и свикнеш ли, дълго време ще си склонен да търсиш ненужно сложни решения, когато всичко необходимо ти е порядочно подредено в БД...
Сигурен съм, че ти се иска да правиш функционални страници, които да работят добре независимо от натоварването и сложността. С БД процеса става по-удобен, нищо повече...

Ти си решаваш... За файлове, стига да мога, ще помагам...

Успех!
 
sizif просто си перфектен! :)
Благодаря ти много човече без теб незнам до кога щях да се блъскам :D
 

Back
Горе