Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Lijst omzetten op basis van while en explode?

Pagina: 1
Acties:

Onderwerpen


  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Goededag allemaal,

Ik ben al een tijdje aan het brainstormen over een script waarmee ik een lijst met triviavragen kan omzetten naar een ander formaat.

De lijst die ik heb maakt gebruik van de volgende indeling:

Antwoord|Vraag?
Antwoord2|Vraag2?

Terwijl ik ze wil omzetten naar:

<item>
<question>Vraag?</question>
<answer>Antwoord</answer>
</item>
<item>
<question>Vraag2?</question>
<answer>Antwoord2</answer>
</item>

Waar ik mee ben opgekomen is om gebruik te maken van een while loop om de vraag en antwoord te splitsen per \n (linebreak) en exploden op | maar ik kom er maar niet echt uit hoe ik dit moet aanpakken.

Iemand enig idee of een beter idee?

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Post anders eens een stukje code, dan kunnen we misschien zien waar het mis gaat.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • Matis
  • Registratie: Januari 2007
  • Laatst online: 13:41

Matis

Rubber Rocket

Ikzelf gebruik meestal voor dat soort eenvoudige scriptjes PHP.
Wat je bijvoorbeeld zou kunnen doen is het volgende:
Lees het bestand in: http://php.net/manual/en/function.file-get-contents.php
Splits het bestand per lijn \n en daarna de lijnen weer op | http://php.net/manual/en/function.explode.php
Schrijf het bestand weg als XML: http://www.php.net/manual/en/book.xmlwriter.php


Wat je ook zou kunnen doen is het bestand als CSV interpreteren, maar als delimiter de | gebruiken ipv de standaard , http://php.net/manual/en/function.fgetcsv.php
Daarna zou je de inhoud als XML kunnen wegschrijven zoals hierboven vermeld.

If money talks then I'm a mime
If time is money then I'm out of time


  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Ikzelf zat te denken om het zo te doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$invoer = $_POST['invoer'];
$regels = explode("\n", $invoer);

for($i = 0, $size = sizeof($regels); $i < $size; ++$i)
{
$regel2 = explode("|", $regels[$i]);
      echo "
      <item>
             <question>$regel2[1]</question>
             <answer>$regel2[0]</answer>
      </item>
";
}


Na wat testen lukt dit blijkbaar toch, met probleem echter dat ik de tags niet zie. Iemand daar de oplossing voor?

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 28-10 14:26
Verander < voor
code:
1
&gt;
en verander > voor
code:
1
&lt;


Als het goed is moet het dan werken.

[ Voor 13% gewijzigd door The_Ghost16 op 14-02-2011 16:22 ]


Verwijderd

The_Ghost16 schreef op maandag 14 februari 2011 @ 16:21:
Verander < voor
code:
1
&gt;
en verander > voor
code:
1
&lt;


Als het goed is moet het dan werken.
Maar dan precies andersom.

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Ah, dit deed het hem :)

Dankjewel ^^

Kan ik eindelijk m'n Teamspeak Quiz Bot inzetten xD

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • The_Ghost16
  • Registratie: Januari 2004
  • Laatst online: 28-10 14:26
Oh lol :P Was ff snel uit me hoofd. Lekker slim eigenlijk :S

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Ik verwachte eigenlijk niet eens dat m'n code al zo snel zou werken. Best wel weird XD

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • bindsa
  • Registratie: Juli 2009
  • Niet online
Jeffroiscool schreef op maandag 14 februari 2011 @ 16:17:
Ikzelf zat te denken om het zo te doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$invoer = $_POST['invoer'];
$regels = explode("\n", $invoer);

for($i = 0, $size = sizeof($regels); $i < $size; ++$i)
{
$regel2 = explode("|", $regels[$i]);
      echo "
      <item>
             <question>$regel2[1]</question>
             <answer>$regel2[0]</answer>
      </item>
";
}


Na wat testen lukt dit blijkbaar toch, met probleem echter dat ik de tags niet zie. Iemand daar de oplossing voor?
Dat komt omdat de browser die tags verwerkt als XML. In de broncode kan je ze wel zien (iets van CTRL+U) meestal.

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 12:56
Voor dit soort eenmalige omzettingsacties kan het waarschijnlijk niet zoveel kwaad, maar ik voorzie nog wel wat mogelijke problemen die kunnen optreden als de iputdata niet helemaal is wat je verwacht...

* Klopt de aanname dat er in de antwoordtekst geen | voorkomt? Wellicht splitst het programma waar je data vandaan komt alleen op de eerste |.

* Klopt de aanname dat er geen tekens met bijzondere betekenis in XML voorkomen in de originele tekst?

Met strings klooien is doorgaans niet de beste manier om XML te maken. In PHP heb je hele handige libraries (DOM, simpleXML) die je helpen om te voorkomen dat je tagsoup produceert. Maar goed, dat is iets voor een andere keer, voor zo'n simpele omzetting is het een beetje overkill.

Regeren is vooruitschuiven


  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Je denkt ook aan je XML declaratie en een root tag?

En dus ook geen
code:
1
&gt; of &lt;
gebruiken, dan heb je geen xml meer. Gewoon < en > laten staan.

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Nogmaals bedankt allemaal, hierbij definitieve versie van het script.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$invoer = $str;
$regels = explode("\n", $invoer);

//XML Writer
$oXMLout = new XMLWriter();
$oXMLout->openMemory();
$oXMLout->startDocument('1.0'); 
$oXMLout->setIndent(4);
$oXMLout->startElement("quiz");
$oXMLout->writeAttribute("name", "Nederlands");
$oXMLout->writeAttribute("source", "http://www.fakegaming.eu/");
for($i = 0, $size = sizeof($regels); $i < $size; ++$i)
{
$regel2 = explode("¶", $regels[$i]);
$oXMLout->startElement("item");
$oXMLout->writeElement("question", $regel2[0]);
$oXMLout->writeElement("answer", $regel2[1]);
$oXMLout->endElement();
}
$oXMLout->endElement();
$oXMLout->endDocument(); 
$xml = $oXMLout->outputMemory();
$oXMLout->flush();

$myFile = "convert.quizml";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, $xml);
fclose($fh);

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • bindsa
  • Registratie: Juli 2009
  • Niet online
Jeffroiscool schreef op donderdag 17 februari 2011 @ 11:52:
PHP:
1
$regel2 = explode("¶", $regels[$i]);
Huh? Dat heb ik nog nooit eerder gezien....

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
L0calh0st schreef op donderdag 17 februari 2011 @ 14:47:
[...]


Huh? Dat heb ik nog nooit eerder gezien....
En toch bestaat die :P

Ik ben later een andere lijst gaan gebruiken, bijna zelfde formaat maar in plaats van | deden ze dat. Ik vind het best, het werkt ^^ (Teamspeakquizbot FTW)

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • Cartman!
  • Registratie: April 2000
  • Niet online
Paar tips:
- gebruik engels OF nederlands, niet door elkaar (bij voorkeur zou ik sowieso engels doen)
- gebruik file_put_contents() voor t opslaan van je file, veel korter en doet t zelfde
- wees consistent met prefixen of doe t niet ($oXMLout, $xml), ik zou sowieso niet prefixen..
- $invoer = $str; dat heeft geen zin, gebruik dan gewoon $str meteen ;)

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Cartman! schreef op donderdag 17 februari 2011 @ 21:51:
Paar tips:
- gebruik engels OF nederlands, niet door elkaar (bij voorkeur zou ik sowieso engels doen)
- gebruik file_put_contents() voor t opslaan van je file, veel korter en doet t zelfde
- wees consistent met prefixen of doe t niet ($oXMLout, $xml), ik zou sowieso niet prefixen..
- $invoer = $str; dat heeft geen zin, gebruik dan gewoon $str meteen ;)
Ik had de hele trivia lijst in $str staan ;)
file_put_contents() is een nieuwe voor me, ga ik proberen.

Het prefixen snap ik ff niet :P

Als je nog weer wilt opmerken wil ik ook wel m'n CMS WiP linken hoor :P

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


  • Cartman!
  • Registratie: April 2000
  • Niet online
Jeffroiscool schreef op donderdag 17 februari 2011 @ 23:28:
[...]
Ik had de hele trivia lijst in $str staan ;)
Waarom maak je dan een nieuwe variabele aan:
PHP:
1
2
3
4
$invoer = $str;
$regels = explode("\n", $invoer);
// ipv
$lines = explode("\n", $str);
Het prefixen snap ik ff niet :P
Ik gok dat je oXMLoutput geript hebt van een ander dan, die 'o' staat vermoedelijk voor 'object' om aan te geven wat voor type variabele het is. Dat heet prefixen (dus bijv. sName/strName als string, aLines/arrLines als array). Ik zou t je niet aanraden :)
Als je nog weer wilt opmerken wil ik ook wel m'n CMS WiP linken hoor :P
Nee dankje ;)

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Topicstarter
Cartman! schreef op vrijdag 18 februari 2011 @ 00:01:
[...]

Waarom maak je dan een nieuwe variabele aan:
PHP:
1
2
3
4
$invoer = $str;
$regels = explode("\n", $invoer);
// ipv
$lines = explode("\n", $str);


[...]

Ik gok dat je oXMLoutput geript hebt van een ander dan, die 'o' staat vermoedelijk voor 'object' om aan te geven wat voor type variabele het is. Dat heet prefixen (dus bijv. sName/strName als string, aLines/arrLines als array). Ik zou t je niet aanraden :)

[...]

Nee dankje ;)
Het was gewoon even quick'n'dirty om het zo in te voeren, stukje luiheid aangezien het script publiekelijk waarschijnlijk toch niet gebruikt word.

Stukje voor XML heb ik alleen

$oXMLout->openMemory();
$oXMLout->startDocument('1.0');
$oXMLout->setIndent(4);

Geript van de help forums, dan ga ik uiteraard verder met dezelfde variable :P

Ik zal zeker wel wat doen met deze tips, ik wil zoiezo beter en efficienter worden met PHP :)

Hartstikke bedankt!

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W

Pagina: 1