Hallo,

Ik heb een .php bestand met daarin op elke regel data welke begint met een uniek 4-cijferig ID nummer. De data wordt gescheiden door een '$' teken en ziet er ongeveer alsvolgt uit: 31$username$userpass$usermail$

De data word door een extern programma gegenereerd en gelezen, dus in de opmaak van de regel kan ik zelf niets wijzigen.

Ik ben op zoek naar een script die op elke regel de unieke ID leest, deze aan een array (o.i.d.) toevoegt en (de regel met) het hoogste ID nummer eruit haalt, een nieuw ID nummer maakt (hoogste +1) en deze nieuwe ID met resterende data op een nieuwe regel schrijft.

Ik zit hopeloos vast en kan alleen het onderstaande bedenken wat helaas niet wil werken. Ook het pas toegevoegde INI/TXT reader script/class wil niet werken.

Alvast bedankt voor de hulp, hieronder mijn eigen brouwseltje waarmee ik hopeloos kom vast te zitten...

error_reporting(E_ALL);
srand((double)microtime()*1000000);
$idnr = rand(0001,9999);

$fp = fopen("gebruikers.php","a+");
$i=1;
while(!feof($fp)) {
$test = fgets($fp,256);
$rest = substr ($test, 0, 1);
$i++;
}
if ($rest == $idnr)
{
echo "New: $idnr Existing: $rest<br />\n";
echo "Data NOT Added\n";
}
else
{
echo "New: $idnr Existing: $rest<br />\n";
echo "Data Added\n";
break;
}
fclose($fp);
Beste Klaasjan,

ik zoek geen database aangezien het externe programma werkt met een zogenaamde "flat file database" en dus niet met bijv. MySQL.

Dus, mocht je een andere manier weten om mij (zonder mij een database aan te raden) te helpen dan sta ik open voor hulp en suggesties...
File regels in array() zetten,
Dan met foreach() bij elke regel een explode() en het getal gebruiken als key en de rest van de regel als waarde in een ander array() zetten.
Sorteren en klaar.
Bedankt Lazy, ik zal dit morgen direct gaan proberen (heb nu iets teveel mixjes op)

M.vr.gr,

Rik
SanThe (Lazy), ik zou je hulp goed kunnen gebruiken aangezien ik weer vast ben komen te zitten. Ik heb het volgende:

error_reporting(E_ALL);

$file_handle = fopen("gebruikers.php", "a+");
while (!feof($file_handle)
{
$line_of_text = fgets($file_handle);
$parts = explode('$', $line_of_text);
echo "" . $parts[0] . "<br />\n";
}
fclose($file_handle);

Maar het wil mij niet lukken om het IDnr (array[0]) in een nieuwe array te plaatsten, de rest van de data (array[1] ... [13]) in een aparte en de hoogste waarde (IDnr) uit array[0] te halen.

Alvast bedankt, de code danst voor mijn ogen en heb (ondanks de hulp van php.net en diverse fora) geen flauw benul meer waar ik het zoeken moet.

M.vr.gr,

Rik
Dit had ik gisteravond nog even gemaakt om te testen.
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

// file met gegevens maken
$link = fopen("hulp.txt", "w");
for ($i = 0; $i < 100; $i++)
{
$tekst = rand(1, 9999) . '$username$userpass$usermail$' . $var = ($i<99) ? "\n\r" : "";
fwrite($link, $tekst);
}
fclose($link);

// file in array() inlezen en nieuw array() vullen met het getal als de key en de rest als de waarde.
$link = file("hulp.txt");
$array = array();
foreach($link as $regel)
{
$arr = explode('$', $regel, 2);
$array[$arr[0]] = $arr[1];
}

// array() sorteren op de keys
ksort($array);

foreach($array as $key => $value)
{
echo $key . ' => ' . $value . '<br/>';
}
?>
SanThe (Lazy),

Ik dacht dat het allemaal wilde lukken, maar helaas gaat er toch (weer) iets niet helemaal zoals het zou moeten.

Hieronder jouw script dat ik heb aangepast naar gebruik voor dat wat ik wil bereiken (namelijk het huidige bestand lezen en een nieuwe regel toevoegen met nieuw id nummer)

Het probleem is dat het script netjes een nieuw, met 1 opgehoogd, nummer wegschrijft maar dat deze na lijn 10 alleen nog maar nummers 1 opnieuw wil aanmaken. Ik heb het vermoeden dat ergens een waarde niet als nummer wordt gezien maar waar gaat het fout?

Hieronder het script dat ik wil gebruiken, alvast bedankt!

<?PHP
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

// TESTVARIABELEN...
$nUsername = "gNaam";
$nUserpass = "gPass";
$nUsermail = "[email protected]";
//

$link = file("users.php");
$array = array();
foreach($link as $regel)
{
$arr = explode('$', $regel, 2);
$array[$arr[0]] = $arr[1];
}
ksort($array);
foreach($array as $key => $value)
{
echo $key . ' => ' . $value . '<br/>';
}

$newidnr = $value+1;
if (!empty($nUsername))
{
$link = fopen("users.php", "a");
$tekst = "" . $newidnr . "\n";
fwrite($link, $tekst);
fclose($link);
}
else
{
echo "Cannot create new user, please try again!";
}
?>
Inmiddels ben ik er achter, ksort($array); doet iets niet helemaal goed...
Dus, deze eruit en het script telt wel netjes door tot voorbij de 10...

SanThe (Lazy), nog heel erg bedankt!

M.vr.gr,

Rik
$newidnr = $value+1;

De getallen zitten in $key en niet in $value.
Dus het is logischer als je dit zou doen:

$newidnr = $key+1;
Is bijgewerkt, verschil was trouwens niet merkbaar...

M.vr.gr,

Rik

Reageren