While -> hoe krijg ik em werkend???

Status
Niet open voor verdere reacties.

DarkFeather

Gebruiker
Lid geworden
21 jan 2004
Berichten
134
Ik heb een script die z'n tekst uit een tekstbestandje haalt. Het tekst bestandje staat uit een nummer (=$t), gevolgd door | (voor de explode), en dan de tekst (=$tekst).

Ik wil dat de loop het volgende doet:
Als hij het hele bestand heeft doorgezocht dat hij dan het nummer (=$t) min 1 doet en dan opnieuw begint te zoeken. $regels is het aantal regels in het tekstbestand. Ik had zelf het onderstaande, maar dat werkt niet goed. Hoe krijg ik het werkend???

Ik had zelf dit:
PHP:
$bestand = fopen("tekst.txt", "r");

while ($i <= $regels) 
{
$buffer = fgets($bestand);
list($nummer,$tekst) = explode("|",$buffer);
if($nummer == $t){
echo $tekst;
break;
}

else 
{
if ($i == $regels)
{
$t = $t - 1;
$i = 0;
}

$i++;
}
}

fclose($bestand);

Het werkt prima als $t in het bestand staat, maar als $t er niet in staat moet er dus $t - 1 en dan opnieuw het bestand doorzoeken. En als die er niet in staat dan weer $t - 1 en opnieuw zoeken enz...
 
Laatst bewerkt:
Wat jij probeert is een ongelofelijk lastige, ingewikkelde en waarschijnlijk overbodige manier om je doel te bereiken ... dus leg eens uit wát je wil bereiken, waarschijnlijk is er wel een andere manier ;)
 
Ik heb dus een tekst-bestandje met daarin een rij nummers, waarvan de hoogste en de laagste bekend zijn. Die staan al in variabelen ($hoogste & $laagste).

Nu wil ik dat als iemand een getal tussen die 2 invoerd dat de tekst achter dat nummer weergegeven wordt. Met het scriptje dat ik nu heb (zie eerste post) gaat dat prima als het getal in het bestandje staat. Het getal wordt dan netjes gevonden en de tekst wordt goed weergegeven.

Maar niet alle getallen staan in het tekstbestandje. Als het getal er niet instaat wil ik dat er automatisch naar een lager getal gegaan wordt, als de variabele $back = 1, en anders naar een hoger getal, net zolang totdat er een getal is dat wel in het bestandje staat.

STEL:
dit is het bestandje
Code:
1| Tekst 1
2| Tekst 2
5| Tekst 5
7| Tekst 7

Als iemand dan 4 invoerd moet ie afhankelijk van de waarde van $back naar waarde 2 resp. 5 gaan. En dan "Tekst 2" resp. "Tekst 5" ook weergeven. De controle of het getal wel lager of gelijk is aan $hoogste of hoger of gelijk is aan $laagste hoeft niet, want als dat het geval is wordt dat getal namelijk gelijkgesteld aan $laagste / $hoogste. Het is ingevoerde getal ligt dus altijd tussen $laagste en $hoogste in.
 
Waarom gebruik je niet gewoon een MySQL database?

Werkt sneller en is makkelijker in gebruik (naar mijn mening :rolleyes: )
 
Bestaat dat dan? PHP host zonder SQL?

En anders kun je nog altijd bij FreeSQL.org (dacht ik) een gratis SQL database aanvragen :)
 
Als het kan zonder MySQL (en dat kan vast wel) wil ik het graag zo oplossen, dus GEEN MySQL en wel een TEKST-bestandje.
 
Geen SQL he ...

edit: ben net tot conclusie gekomen dat het volgens mijn mening niet kan. Het adres was FreeSQL.org :thumb:
 
Laat ik het nog een keer zeggen: GEEN DATABASE!!! Ik wil het met een txt-bestand. Waarom? DAAROM. Dus iemand enig idee hoe ik het goed krijg?
 
Wat je kán doen:
Op elke regel zit 1, en niet meer, '|', ga ik vanuit. Hierdoor kan je exploden op '|'. Het nummer dat voor de '|' staat, is uniek (ga ik ook vanuit, aangezien je eerdere beschrijvingen).
Je kan dan met 2 array's werken, 1 waarin alle getallen worden opgeslagen en 1 met alle waarden. Hierdoor wordt 't wel zo makkelijk om het getal ervoor en erna te pakken.
De PHP code van de getallen & waarden verwerken kan dan zoiets worden:
PHP:
<?
$array = file("bestandsnaam.txt");
$getallen = array();
$waarden = array();
$i = 0;
  foreach($array AS $key => $value)
  {
  $array2 = explode("|",$value);
    foreach($array2 AS $key2 => $value2)
    {
      if($i == 0)
      {
      $getallen[] = $value2;
      $i = 1;
      }
      elseif($i == 1)
      {
      $waarden[] = $value2;
      $i = 0;
      }
    }
  }

// stel, het ingevoerde getal = 5
$ingevoerde_getal = 5;
$komt_hij_voor = array_search($ingevoerde_getal,$getallen);
$regel_ervoor = "";
$regel_gekozen = "";
$regel_erna = "";
  if($komt_hij_voor != FALSE)
  {
  $regel_ervoor .= ($komt_hij_voor - 1);
  $regel_gekozen .= $komt_hij_voor;
  $regel_erna .= ($komt_hij_voor + 1);
  }
  else
  {
    for($i=$ingevoerde_getal;$i>0;$i--)
    {
    $komt_hij_nu_voor = array_search($i,$getallen);
      if($komt_hij_nu_voor != FALSE)
      {
      $i = 0;
      $regel_ervoor .= $komt_hij_nu_voor;
      $regel_erna .= ($komt_hij_nu_voor + 1);
      }
    }
  }

  if(isset($waarden[$regel_ervoor]) == TRUE)
  {
  echo ("Regel ervoor: " . $waarden[$regel_ervoor]);
  }
  else
  {
  echo "Geen regel ervoor";
  }

  if($regel_gekozen != "")
  {
  echo ("<br>Regel gekozen: " . $waarden[$regel_gekozen]);
  }
  else
  {
  echo "<br>Geen geldige regel gekozen";
  }

  if(isset($waarden[$regel_erna]) == TRUE)
  {
  echo ("<br>Regel erna: " . $waarden[$regel_erna]);
  }
  else
  {
  echo "<br>Geen regel erna";
  }
?>
Succes :thumb:

// Edit: kloar met testen, werkt super :thumb:
 
Laatst bewerkt:
Heel erg bedankt voor de moeite alvast, maar het script werkt niet helemaal zoals ik wil. Stel dit is m'n tekst-bestand:
Code:
1001|Tekst 1001
1007|Tekst 1007
1008|Tekst 1008
1005|Tekst 1005
1010|Tekst 1010
1003|Tekst 1003
1009|Tekst 1009
1011|Tekst 1011
1023|Tekst 1023

Als ik nu $ingevoerde_getal = 1004; Dan is $regel_ervoor = 1003, en $regel_erna = 1009, terwijl $regel_erna 1005 moet zijn (want 1005 komt eerder na 1004 dan 1009). En als ik $ingevoerde_getal = 1002; dan vind het script helemaal niets. En ook niet als ik 1001 invoer, dan vind ie ook helemaal niets, terwijl 1001 er dus wel in staat.

De bedoeling is als iemand 1002 invoert en $back = 1 dat ie dan Tekst 1001 te zien krijgt. Als back niet 1 is dat ie dan dus Tekst 1003 te zien krijgt. En als iemand 1004 invoert en back is 1 dat ie dan Tekst 1003 te zien krijgt en anders Tekst 1005. En als iemand 1001 invoert dat ie dan Tekst 1001 te zien krijgt. Hij hoeft dus niet $regel_ervoor en $regel_erna te laten zien. Of vraag ik nu iets extreem moeilijk?

Maar stel de ingevoerde waarde staat niet in het tekstbestandje, dan moet het script de waarde verhogen/verlagen (afhankelijk van $back) en dan opnieuw gaat zoeken of de waarde erin staat, staat de nieuwe waarde er ook niet in dan moet hij weer gaan verhogen/verlagen (weer afhankelijk van $back) en net zolang tot de waarde wel is gevonden. De waarde ligt altijd tussen de hoogste en laagste waarde in. Dus lager dan de laagste waarde, of hoger dan de hoogste zal de waarde niet zijn.
 
Laatst bewerkt:
Geplaatst door DarkFeather
Heel erg bedankt voor de moeite alvast, maar het script werkt niet helemaal zoals ik wil. Stel dit is m'n tekst-bestand:
Code:
1001|Tekst 1001
1007|Tekst 1007
1008|Tekst 1008
1005|Tekst 1005
1010|Tekst 1010
1003|Tekst 1003
1009|Tekst 1009
1011|Tekst 1011
1023|Tekst 1023
Da's niet mijn schuld, in je vorige post waren alle cijfertjes mooi op volgorde, dus daar maakte ik in m'n vorig geposte script gebruik van :rolleyes:;)
Probeer dit script eens:
PHP:
<?
$array = file("bestandsnaam.txt");
$getallen = array();
$waarden = array();
$i = 0;
  foreach($array AS $key => $value)
  {
  $array2 = explode("|",$value);
    foreach($array2 AS $key2 => $value2)
    {
      if($i == 0)
      {
      $getallen[] = $value2;
      $i = 1;
      }
      elseif($i == 1)
      {
      $waarden[] = $value2;
      $i = 0;
      }
    }
  }

// stel, het ingevoerde getal = 5
$ingevoerde_getal = 1014;
$komt_hij_voor = array_search($ingevoerde_getal,$getallen);
$regel_ervoor = "";
$regel_gekozen = "";
$regel_erna = "";
  if($komt_hij_voor != FALSE)
  {
  $regel_gekozen .= $komt_hij_voor;
  }

  if($ingevoerde_getal > $laagste_getal)
  {
    for($i=($ingevoerde_getal - 1);$i>0;$i--)
    {
    $komt_hij_nu_voor = array_search($i,$getallen);
      if($komt_hij_nu_voor != FALSE)
      {
      $i = 0;
      $regel_ervoor .= $komt_hij_nu_voor;
      }
    }
  }

  if($ingevoerde_getal < $hoogste_getal)
  {
    for($i=($ingevoerde_getal + 1);$i>$ingevoerde_getal;$i++)
    {
    $komt_hij_nu_voor = array_search($i,$getallen);
      if($komt_hij_nu_voor != FALSE)
      {
      $i = ($ingevoerde_getal - 1);
      $regel_erna .= $komt_hij_nu_voor;
      }
    }
  }

  if(isset($waarden[$regel_ervoor]) == TRUE)
  {
  echo ("Regel ervoor: " . $waarden[$regel_ervoor]);
  }
  else
  {
  echo "Geen regel ervoor";
  }

  if($regel_gekozen != "")
  {
  echo ("<br>Regel gekozen: " . $waarden[$regel_gekozen]);
  }
  else
  {
  echo "<br>Geen geldige regel gekozen";
  }

  if(isset($waarden[$regel_erna]) == TRUE)
  {
  echo ("<br>Regel erna: " . $waarden[$regel_erna]);
  }
  else
  {
  echo "<br>Geen regel erna";
  }
?>
In dit script check ik of het ingevoerde getal groter is dan $laagste_getal en of het ingevoerde getal kleiner is dan $hoogste_getal ...
Hou er wel rekening mee, dat als $laagste_getal gelijk is aan 1, $hoogste_getal gelijk is aan 40698, je in het tekstbestand 1 regel tekst heb staan beginnende met het cijfer 39278 en het ingevoerde getal gelijk is aan 5 ... dan zal hij in de lus net zo vaak 1 optellen bij het ingevoerde_getal totdat hij bij 39278 komt ... wat dus eeeeeeeeeeeeeeeeeeeeerrug lang kan duren ... :D
Je kan eventueel wel een beveiliging maken hiervoor, simpel een if() erbij zetten :)

Succes er mee :thumb:
 
Geplaatst door masterprut
Maar waarom geen SQL :confused:
In deze tijd zijn er nog hosts die geen database-ondersteuning bieden ... Maar mensen met een beetje php ervaring gaan toch écht wel voor een mét SQL ... Aangezien SQL vrij populair is ;)
 
Sja, en waarom koppig doen als je op FreeSQL een host kunt regelen. En als je met PHP oefent kun je het beste een webserver installeren zoals de meesten tegenwoordig hebben :cool:
 
Geplaatst door JPeetje
Da's niet mijn schuld, in je vorige post waren alle cijfertjes mooi op volgorde, dus daar maakte ik in m'n vorig geposte script gebruik van :rolleyes:;)
Probeer dit script eens:
PHP:
scriptje...
In dit script check ik of het ingevoerde getal groter is dan $laagste_getal en of het ingevoerde getal kleiner is dan $hoogste_getal ...
Hou er wel rekening mee, dat als $laagste_getal gelijk is aan 1, $hoogste_getal gelijk is aan 40698, je in het tekstbestand 1 regel tekst heb staan beginnende met het cijfer 39278 en het ingevoerde getal gelijk is aan 5 ... dan zal hij in de lus net zo vaak 1 optellen bij het ingevoerde_getal totdat hij bij 39278 komt ... wat dus eeeeeeeeeeeeeeeeeeeeerrug lang kan duren ... :D
Je kan eventueel wel een beveiliging maken hiervoor, simpel een if() erbij zetten :)

Succes er mee :thumb:

Geweldig! :thumb: :thumb: :thumb:

Toch nog een vraagje:
Wat ik me bedacht, is het niet mogelijk om eerst alle regels (in z'n geheel) in een array te zetten, deze dan te sorteren en dan pas te exploden? Dan zou je niet telkens 1 bij ophoeven te tellen, maar direct de vorige of volgende in de array nemen, en dan pas exploden.
 
Laatst bewerkt:
Geplaatst door JPeetje
In deze tijd zijn er nog hosts die geen database-ondersteuning bieden ... Maar mensen met een beetje php ervaring gaan toch écht wel voor een mét SQL ... Aangezien SQL vrij populair is ;)

Net vandaag een eigen domein aangevraagd, natuurlijk met MySQL (heeft toch enorm veel voordelen!). Ik heb/had een eigen stukje ruimte op het domein van een vriend van mij, maar die wou liever niet dat ik z'n database-je gebruikt, dus vandaar deze oplossing. Ik heb een heel foto-albumscript en nieuwsscript in php geschreven, zonder database, dus allemaal met tekst-bestandjes. Ga nu alles opnieuw schrijven (als ik er niet uitkom horen jullie het vanzelf wel weer :P), zodat alles in de database kan en niet meer in tekstbestandjes. Tot die tijd gebruik ik m'n oude scripts nog!
 
Geplaatst door DarkFeather
Toch nog een vraagje:
Wat ik me bedacht, is het niet mogelijk om eerst alle regels (in z'n geheel) in een array te zetten, deze dan te sorteren en dan pas te exploden? Dan zou je niet telkens 1 bij ophoeven te tellen, maar direct de vorige of volgende in de array nemen, en dan pas exploden.
Daar zeg je wat ... :o
Dat zou idd een veel snellere methode zijn dan die ik net had bedacht :)
Als je asort() op de getallen array toepast, worden alle waarden in de array geordend, terwijl de sleutel hetzelfde blijft waardoor je het verband met de waarden array blijft houden ... idd wel zo handig :)
Maar aangezien je al besloten hebt om met databases te gaan werken zal ik niet moeite gaan doen om het script weer aan te passen :p

Succes verder :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan