Archief - Parse error: syntax error, unexpected '<'

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GamesMaxed

Legacy Member
Hallo,

ik ben bezig met een kleine web app te maken maar ik zit met volgend probleem: telkens als ik mijn index.php open krijg ik "Parse error: syntax error, unexpected '<' in D:\xampp\htdocs\Prices\table.php on line 17 "
Weet iemand hoe ik dat kan fixen?

index.php
PHP:
<?php
// Tijd berekenen hoelang het duurt op pagina te generen.
$time['start'] = microtime();
$time['start'] = explode(' ', $time['start']);

// Klassen importeren & aanmaken als het nodig is
require_once('config.php');
require_once('item.php');
require_once('table.php'); // @TODO: Table klasse maken die het makkelijker maakt op tabellen te maken. ?array voor alle items?


/* ********************
* !! OBJECTS MAKEN !! *
***********************/
// TOOLS
// axe's
$item['tool']['axe'][0] = new Item('Bronze axe');
$item['tool']['axe'][1] = new Item('Iron axe');
$item['tool']['axe'][2] = new Item('Steel axe');
$item['tool']['axe'][3] = new Item('Black axe');
$item['tool']['axe'][4] = new Item('Mithril axe');
$item['tool']['axe'][5] = new Item('Adamant axe');
$item['tool']['axe'][6] = new Item('Rune axe');
$item['tool']['axe'][7] = new Item('Dragon axe');
// pickaxe
$item['tool']['pickaxe'][0] = new Item('Bronze pickaxe');
$item['tool']['pickaxe'][1] = new Item('Iron pickaxe');
$item['tool']['pickaxe'][2] = new Item('Steel pickaxe');
$item['tool']['pickaxe'][3] = new Item('Black pickaxe');
$item['tool']['pickaxe'][4] = new Item('Mithril pickaxe');
$item['tool']['pickaxe'][5] = new Item('Adamant pickaxe');
$item['tool']['pickaxe'][6] = new Item('Rune pickaxe');


// WAPENS
// Sword
$item['weapon']['sword'][0] = new Item('Bronze sword');
$item['weapon']['sword'][1] = new Item('Iron sword');
$item['weapon']['sword'][2] = new Item('Steel sword');
$item['weapon']['sword'][3] = new Item('Black sword');
$item['weapon']['sword'][4] = new Item('Mithril sword');
$item['weapon']['sword'][5] = new Item('Adamant sword');
$item['weapon']['sword'][6] = new Item('Rune sword');
// Longsword
$item['weapon']['longsword'][0] = new Item('Bronze longsword');
$item['weapon']['longsword'][1] = new Item('Iron longsword');
$item['weapon']['longsword'][2] = new Item('Steel longsword');
$item['weapon']['longsword'][3] = new Item('Black longsword');
$item['weapon']['longsword'][4] = new Item('Mithril longsword');
$item['weapon']['longsword'][5] = new Item('Adamant longsword');
$item['weapon']['longsword'][6] = new Item('Rune longsword');
$item['weapon']['longsword'][7] = new Item('Dragon longsword');
// Scimitars
$item['weapon']['scimitar'][0] = new Item('Bronze Scimitar');
$item['weapon']['scimitar'][1] = new Item('Iron Scimitar');
$item['weapon']['scimitar'][2] = new Item('Steel Scimitar');
$item['weapon']['scimitar'][3] = new Item('Black Scimitar');
$item['weapon']['scimitar'][4] = new Item('Mithril Scimitar');
$item['weapon']['scimitar'][5] = new Item('Adamant Scimitar');
$item['weapon']['scimitar'][6] = new Item('Rune Scimitar');
$item['weapon']['scimitar'][7] = new Item('Dragon Scimitar');
// Daggers
$item['weapon']['dagger'][0] = new Item('Bronze dagger');
$item['weapon']['dagger'][1] = new Item('Iron dagger');
$item['weapon']['dagger'][2] = new Item('Steel dagger');
$item['weapon']['dagger'][3] = new Item('Black dagger');
$item['weapon']['dagger'][4] = new Item('Mithril dagger');
$item['weapon']['dagger'][5] = new Item('Adamant dagger');
$item['weapon']['dagger'][6] = new Item('Rune dagger');
$item['weapon']['dagger'][7] = new Item('Dragon dagger');
?>
<!doctype html>

<html lang="nl">
    <head>
        <meta charset="utf-8" />
        <script type="text/javascript">var NREUMQ=NREUMQ||[];NREUMQ.push(["mark","firstbyte",new Date().getTime()]);</script>
<script type="text/javascript">var NREUMQ=NREUMQ||[];NREUMQ.push(["mark","firstbyte",new Date().getTime()]);</script>
<title>Price guide</title>
        <style>
            img{
                width: auto;
                height: auto;
            }
        </style>
    </head>

    <body>
        <p>
            In deze prijs guide worden alle prijzen van Oldschool Runescape op een overzichtelijk manier weergegeven.<br/>
            De prijzen zijn realtime en worden geüpdate telkens als u uw pagina herlaad! <br />
        </p>

        <?php
        $table = new Table();
        echo '<h2>Tools</h2> <hr />';
        $table->draw($item['tool']['axe'], 'Axe');
        $table->draw($item['tool']['pickaxe'], 'Pickaxe');
        echo '<h2>Wapens</h2>';
        $table->draw($item['weapon']['sword'], 'Sword');
        $table->draw($item['weapon']['longsword'], 'Longsword');
        $table->draw($item['weapon']['scimitar'], 'Scimitar');
        ?>
    
    <p>
    Deze site is mogelijk gemaakt door <a href="http://www.zybez.net">Zybez</a> en draait op zijn prijzen.
     <!-- TIJD -->
        <?php
        $time['end'] = microtime(); //"einde" meten. Alles hierna zit dus NIET meer bij de bereking van hoelang het duurt
        $time['end'] = explode(' ', $time['end']);

        $time['load'] = $time['end'][0] - $time['start'][0];
        $time['load'] = round($time['load'], 4);
        $time['load'] = str_replace('.' , ',' , $time['load']); // Van punten naar kommas gaan, omdat we in de BeNeLux kommas gebruiken inplaats van punten gelijk in de USA.

        echo 'Pagina gegenereed in ' . $time['load'] . ' seconden';
        ?>
    </p>
    <script type="text/javascript">if(!NREUMQ.f){NREUMQ.f=function(){NREUMQ.push(["load",new Date().getTime()]);var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://d1ros97qkrwjf5.cloudfront.net/42/eum/rum.js";document.body.appendChild(e);if(NREUMQ.a)NREUMQ.a();};NREUMQ.a=window.onload;window.onload=NREUMQ.f;};NREUMQ.push(["nrf2","beacon-1.newrelic.com","d294042fdc","727136","NAFbYBBVCBZVAEFaWA1LbEYLG0w=",0,124,new Date().getTime()]);</script>
<script type="text/javascript">if(!NREUMQ.f){NREUMQ.f=function(){NREUMQ.push(["load",new Date().getTime()]);var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://d1ros97qkrwjf5.cloudfront.net/42/eum/rum.js";document.body.appendChild(e);if(NREUMQ.a)NREUMQ.a();};NREUMQ.a=window.onload;window.onload=NREUMQ.f;};NREUMQ.push(["nrf2","beacon-1.newrelic.com","d294042fdc","727136","NAFbYBBVCBZVAEFaWA1LbEYLG0w=",0,128,new Date().getTime()]);</script>
</body>
</html>

<?php
if(Config::$debug){
    echo '<pre>';
        print_r($item);
    echo '</pre>';
}
?>

item.php
PHP:
<?php
class Item{
    /* 
    De config class moet niet geïmporteerd worden aangezien deze als is geimporteerd in index.php
    */
    
    // Variablen
    public $zybezLinkAPI;
    public $vars =[
                'name',
                'zybezLink',
                'lowPrice',
                'medPrice',
                'highPrice',
                'picture',
                'alch'];

    function __construct($name){
        $this->name = $name;
        $name = str_replace(' ', '+', $name); //De spaties in de naam veranderen naar '+' zodat de link werkt
        $this->zybezLinkAPI = Config::$zybezURLAPI . $name; //Link maken naar Zybez Price guide

        //JSON halen van Zybez via cUrl
        $ch = curl_init();
        //Opties cURL
        curl_setopt($ch, CURLOPT_URL, $this->zybezLinkAPI); // De url naar Zybez
        curl_setopt($ch, CURLOPT_HEADER, false); // <head> niet mee opvragen
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Niet echo'n als het wordt uitgevoerd

        $JSON = curl_exec($ch); //Uitvoeren van cURL en opslagen in JSONlink
        curl_close($ch); //Sluiten van cURL

        // JSON decoden en in array gooien
        $array = JSON_decode($JSON, true);

        // Array uitprinten als debug = true
        /*
        if(Config::$debug){
            echo '<pre>';
                print_r($array);
            echo '</pre>';
        }
        */

        // Selecteren welke index we nodig hebben
        $index = 0;
        if(count($array) !== 1){ //We moeten enkel een index berekenen als er meer dan 1 item in de JSON string staat (Bv. rune axe)
            for($i = 0; $i <= count($array); $i++){
                if($array[$i]['name'] == $this->name){
                    $index = $i;
                    break;
                }
            }
        }

        // Variablen opslagen
        $this->vars['name'] = $array[$index]['name']; // De naam wordt nog eens opgeslagen zodat de hoofdletters correct zijn
        $this->vars['lowPrice'] = $array[$index]['recent_low'];
        $this->vars['medPrice'] = round($array[$index]['average']); //Om een of andere redenen komen hier altijd 3 cijfers na de komma, wat ik niet wil.
        $this->vars['highPrice'] = $array[$index]['recent_high'];
        $this->vars['picture'] = $array[$index]['image'];
        $this->vars['alch'] = $array[$index]['high_alch'];
        $this->vars['zybezLink'] = Config::$zybezURL . $array[$index]['id'];

        return vars;
    }

}
?>

table.php
PHP:
<?php
class Table{
    public function draw($array, $tableHeader){
        //Hoofd van de tabel opmaken
        echo '<h3>' . $tableHeader . '</h3>';
        echo '<table>';
        echo '<tr>';
            echo '<th>Plaatje</th>';
            echo '<th>Naam</th>';
            echo '<th>Minimum prijs</th>';
            echo '<th>Markt pijs</th>';
            echo '<th>Maximum prijs</th>';
            echo '<th>High alch</th>';
        echo '</tr>';

        //alles afgaan, een for werkt hier beter als een foreach
        for($i = 0; $i =< count($array); $i++) {
            // Plaatje
            echo '<img src="'. $array[$i]['picture'] .'" alt ="'. $array[$i]['name'] .'"/> ';
            // Naam
            echo '<tr>'. $array[$i]['name'] .'</tr>';
            // Lage prijs
            echo '<tr>'. $array[$i]['lowPrice'] .'</tr>';
            // Marktpijs
            echo '<tr>'. $array[$i]['medPrice'] .'</tr>';
            // Hoge prijs
            echo '<tr>'. $array[$i]['highPrice'] .'</tr>';
            // High alch
            echo '<tr>'. $array[$i]['alch'] .'</tr>';
        }
        echo '</table>';
    }
}
?>

config.php
PHP:
<?php
class Config{
    public static $zybezURLAPI = 'http://forums.zybez.net/pages/2007-price-guide-api?term=';
    public static $zybezURL = 'http://forums.zybez.net/pages/2007-price-guide?id=';
    public static $debug = true;
}
?>

Later zou ik ook nog met een lokala database gaan werken op minder dataverkee te hebben, en dat de gebruiker dan op een knopje moet drukken als hij wilt dat alles updated maar dat is iets voor later.

Die js die er bij index.php erbij staat komt door het forum zelf, kan ik niets aan doen. In het echt staat die er niet bij.

ultddave

Legacy Member
Hey,

Deze had je volgens mij toch zelf kunnen vinden denk ik, als ik zie wat voor code je zit te schrijven ;).

Probleem regel:
Code:
for($i = 0; $i =< count($array); $i++)

Probleem: PHP kent "=<" niet. De operator voor "kleiner dan of gelijk aan" is "<=" ;).

Oplossing:
Code:
for($i = 0; $i <= count($array); $i++)

Succes ;).

Alle operatoren:
http://php.net/manual/en/language.operators.comparison.php

PS: Syntax errors zijn meestal gewoon schrijffoutjes die je hebt gemaakt (puntkomma vergeten is een veel voorkomende fout) ;).

GamesMaxed

Legacy Member
ultddave zei:
Hey,

Deze had je volgens mij toch zelf kunnen vinden denk ik, als ik zie wat voor code je zit te schrijven ;).

Probleem regel:
Code:
for($i = 0; $i =< count($array); $i++)

Probleem: PHP kent "=<" niet. De operator voor "kleiner dan of gelijk aan" is "<=" ;).

Oplossing:
Code:
for($i = 0; $i <= count($array); $i++)

Succes ;).

Alle operatoren:
PHP: Comparison Operators - Manual

PS: Syntax errors zijn meestal gewoon schrijffoutjes die je hebt gemaakt (puntkomma vergeten is een veel voorkomende fout) ;).

Aaah ja, domme fout van mij. Had ik moeten zien. Had echt al een uur naar alles zitten kijken, nakijken etc.

ultddave

Legacy Member
Aaah ja, domme fout van mij. Had ik moeten zien. Had echt al een uur naar alles zitten kijken, nakijken etc.
Geen probleem ;) kan gebeuren :D.

Ik heb ook al van die momenten gehad, bijvoorbeeld zoiets (Semantische fout in Java-code, maar probleem is equivalent voor zo goed als alle talen):

Code:
        ArrayList<Integer> list= new ArrayList<Integer>();
        // Lijst vullen met willekeurige getallen
        list.add(1);
        list.add(20);
        list.add(30);
        list.add(50);
        list.add(1);
        list.add(80);

        // Lijst handmatig legen door "N" keer het eerste element te verwijderen.         
        for(int i = 0; i < list.size(); ++i)
            list.remove(0);

        System.out.println("De lijst is " + list.size() + " groot");

De output is "De lijst is 3 groot", terwijl ik dacht dat ik net alles eruit had gehaald, hoe kan er dan nog iets inzitten? ;)

Reden kan je hieronder vinden indien je het niet direct zou zien:
De conditie van de for-lus is het probleem. list.size() wordt elke keer berekend bij elke iteratie.
Maar omdat je in elke iteratie iets verwijderd, zal i gelijk zijn aan de list.size() in de helft van zijn originele grootte.
Uitgewerkt voorbeeld:
Iteratie 1
- Waarde i = 0 ; list.size() = 6
Iteratie 2
- Waarde i = 1 ; list.size() = 5
Iteratie 3
- Waarde i = 2 ; list.size() = 4
Iteratie 4
- Waarde i = 3 ; list.size() = 3 => springt uit lus

Is tevens ook een fout die bij sommige talen tot memory leaks leidt omdat de programmeur hier denkt dat de lijst volledig leeg is.


Al doende leert men gelukkig. Succes nog met je applicatie ;).

profound

Legacy Member
Is het überhaupt wel mogelijk om door een lijst te itereren en terwijl elementen uit die lijst te gaan verwijderen?

ultddave

Legacy Member
profound zei:
Is het überhaupt wel mogelijk om door een lijst te itereren en terwijl elementen uit die lijst te gaan verwijderen?

Hangt van de datastructuur af. Maar als je op de naïeve wijze zou coderen in Java:
Code:
int size = list.size();
for(int i = 0; i < size; ++i)
   list.remove(i);
Dan zal dat een IndexOutOfBoundsException geven omdat je indices niet meer zullen bestaan na een aantal iteraties.
Omdat je verwijdert op index "i".


Maar als je enkel het eerste element verwijdert, "size" keren, dan gaat dat zonder problemen.

Maar gelukkig zijn de voorziene datastructuren in de meeste talen voorzien van een "clear" functie ;).

Het gaat uiteraard ook via een Iterator klasse die al wat ingebouwde safety measures heeft:
Iterator (Java Platform SE 6)
Code:
Iterator<Integer> it = list.iterator();
while(it.hasNext())
{
   it.next();
   it.remove();
}

profound zei:
Is het überhaupt wel mogelijk om door een lijst te itereren en terwijl elementen uit die lijst te gaan verwijderen?

Dus; in de veronderstelling dat het geen HashMap of iets dergelijks is met Key > Value mapping en dat we ook Multi-threading buiten beschouwing laten, zal dat geen probleem zijn volgens mij ;).

PS; Om je een voorbeeld te geven waarom zoiets handig is; Stel je hebt een lijst van 10.000 getallen en je wilt bijvoorbeeld alle getallen > 89 verwijderen uit die lijst. Dan kan je doorheen de lijst itereren en enkel die elementen verwijderen die voldoen aan die conditie ;).

Kilghard

Legacy Member
In php gaat dit vrij makkelijk met een foreach loop?
Bestaat zo iets niet in java/script? (sorry ken echt niet veel buiten mijn gebied :p)

bvb heel simpeltjes :

<?php
$array = array(1,2,3,4,5);
$i = 0;
foreach ($array as &$value)
{
unset($array[$i]);
$i++;
}
print_r($array);
?>

ultddave

Legacy Member
Kilghard zei:
In php gaat dit vrij makkelijk met een foreach loop?
Bestaat zo iets niet in java/script? (sorry ken echt niet veel buiten mijn gebied :p)

bvb heel simpeltjes :

<?php
$array = array(1,2,3,4,5);
$i = 0;
foreach ($array as &$value)
{
unset($array[$i]);
$i++;
}
print_r($array);
?>
True, in dit geval gaat dat goed werken. Maar een array in PHP is in principe een HashMap, check hier;
PHP Unset Array Value - Stack Overflow

Dus je hebt echt een Key > Value mapping.
Als je dus doet:
unset($array[0]);
Dan verwijder je element met "key" = 0.

De tweede keer dat je die unset-regel gaat aanroepen, staat die key 0 er niet meer in, dus gaat het niets doen (of gaat het misschien een error geven - geen idee) ;).

EDIT: Even getest, deze code:
PHP:
$array = array(1,2,3,4,5);
foreach ($array as &$value)
   unset($array[0]); // Altijd element op index 0 verwijderen.
print_r($array);
geeft: Array ( [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) geen error. Maar de indices schuiven niet automatisch mee op ;). Kan je wel handmatig terug fixen via een array_values call, but still ;).

Maar als je daarvan op de hoogte bent en daar rekening mee houdt, is dat uiteraard geen probleem.

EDIT; http://php.net/manual/en/language.types.array.php (eerste regels tekst voor degene die me niet zouden geloven ^^)

In Java heb je inderdaad ook een soort foreach-lus:
Code:
for(Integer v : list)
   System.out.println(v);
Maar die geeft je direct de waarde van elk element (zoals in de PHP-code hierboven) en geen index of iterator. En het is niet toegelaten om de lijst aan te passen binnen zo een lus.

Dus:
Code:
for(Integer v : list)
    list.remove(0);
is illegaal en krijg je zo een leuke "ConcurrentModificationException" :P. Enkel als je zelf handmatig met een Iterator doorheen de lijst gaat, mag je zaken verwijderen met de "remove" functie die deze voorziet. Als je dat impliciet laat gebeuren door zo een speciale for-lus constructie, dan mag je niets uit die lijst verwijderen ;).

Van Javascript is mijn kennis niet zo uitgebreid, maar ik denk niet dat je daar zo simpel elementen uit bijvoorbeeld een array kan verwijderen;
JavaScript Array Delete Elements - Stack Overflow

In principe is er ook wel een verschil tussen een Lijst en een array. In Java kan je bijvoorbeeld geen elementen uit een array verwijderen (tenzij je de array zou kopieren en splitsen en daarna terug samenvoegen zonder dat ene element). Wel uit lijsten.

PS: Als ik me ergens vergist moest hebben, mag je dat altijd zeggen, dan leer ik weer wat bij ;).

Kilghard

Legacy Member
Dat van die php klopt inderdaad
vandaar ook dat ik die
$i = 0;
$i++;
regels er in had gezet. Als je dat niet doet gaat er inderdaad niet veel gebeuren :p.
Maar door de $i variable zal hij nooit 2x dezelfde unset regel aanroepen maar door de hele array itereren.

Dieterg

Legacy Member
Waarom niet gewoon van vanachter in de list beginnen? Ik denk dat dat in elke taal werkt.. Dan heb je geen problemen met de index? :-)

Code:
for (int i = list.size(); i > 0; i--) 
{
   list.removeAt(i);
}

In ieder geval de TS zen probleem is opgelost! :lol:

ultddave

Legacy Member
Dat van die php klopt inderdaad
vandaar ook dat ik die
$i = 0;
$i++;
regels er in had gezet. Als je dat niet doet gaat er inderdaad niet veel gebeuren .
Maar door de $i variable zal hij nooit 2x dezelfde unset regel aanroepen maar door de hele array itereren.
True true ;).


Dieterg zei:
Waarom niet gewoon van vanachter in de list beginnen? Ik denk dat dat in elke taal werkt.. Dan heb je geen problemen met de index? :-)

Code:
for (int i = list.size(); i > 0; i--) 
{
   list.removeAt(i);
}

In ieder geval de TS zen probleem is opgelost! :lol:

Moet wel "int i = list.size() - 1" zijn zeker - alé, dat hangt van de taal af en of hij begint te tellen vanaf 0 of niet.

Maar inderdaad, is handiger om achteraan te beginnen ;)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan