Ik ben net begonnen met de opleiding ICT Applicatieontwikkelaar, maar omdat mijn leraar de indruk heeft dat ik al verder ben qua stof dan mijn klasgenoten, kreeg ik een aparte opdracht. Deze opdracht houdt in het maken van een hoger/lager spel, met highscore-functie. Hierbij mag geen database worden gebruikt. Het hoger/lager spel heb ik inmiddels klaar, maar ik vroeg me af hoe ik de highscore-functie het beste kan bouwen.
Zelf dacht ik hierbij aan een array, maar ik weet dan weer niet hoe ik bijvoorbeeld een sessie in een array kan opslaan. Kunnen jullie me hierbij helpen?

index.php

<?php
session_start();
if($_SESSION["name"])
    header("Location:play.php");
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Voer uw naam in</h2>
        <form action="play.php" method="POST">
            <input type="text" name="name">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


play.php

<?php
session_start();
if($_POST["name"]&&!$_SESSION["name"])
    $_SESSION["name"]=$_POST["name"];
elseif(!$_POST["name"]&&!$_SESSION["name"])
    header("Location:index.php");
if(!$_SESSION["numb"])
    $_SESSION["numb"]=rand(1,1000);
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>Kies een cijfer (van 1 tot 1000)</h2>
        <h3>Now Playing: <?php echo $_SESSION["name"]; ?> | <a href="clear.php">Opnieuw</a></h3>
        <h4>Status</h4>
        <p><?php if($_POST["name"]){echo "Invoer speler: ".$_POST["name"]." | ";} ?>Sessie cijfer: <?php echo $_SESSION["numb"]; ?> | Sessie speler: <?php echo $_SESSION["name"]; ?></p>
        <form action="try.php" method="POST">
            <input type="text" name="value">
            <input type="submit" name="savename" value="Spelen!">
        </form>
    </body>
</html>


try.php

<?php
session_start();
if(!$_SESSION["name"])
    header("Location:index.php");
if(!$_SESSION["numb"])
    header("Location:play.php");
if(!$_SESSION["try"])
    $_SESSION["try"]=1;
else
    $_SESSION["try"]=$_SESSION["try"]+1;
?>
<!DOCTYPE html>
<html>
    <head>
        <title>HogerLager</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>HogerLager</h1>
        <h2>U raadde: <?php echo $_POST["value"]; ?> (poging <?php echo $_SESSION["try"]; ?>)</h2>
        <?php
        if(!$_POST["value"]){
            $return="Voer een cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]>$_SESSION["numb"]){
            $return="Voer een lager cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]<$_SESSION["numb"]){
            $return="Voer een hoger cijfer in. <a href=\"play.php\">Opnieuw</a>";
        }elseif($_POST["value"]==$_SESSION["numb"]){
            if($_SESSION["try"]==1)
                $try="poging";
            else
                $try="pogingen";
            $return="GEFELICITEERD! U raadde ".$_SESSION["numb"]." in ".$_SESSION["try"]." ".$try.". <a href=\"highscores.php\">Highscores</a> | <a href=\"play.php\">Opnieuw</a>";
            unset($_SESSION["numb"]);
            unset($_SESSION["try"]);
        }
        ?>
        <h3><?php echo $return; ?></h3>
    </body>
</html>


clear.php

<?php
session_start();
unset($_SESSION["name"]);
header("Location:index.php");
?>
Oké laten we een ander voorbeeldje nemen met enige opbouw

Als eerste een enkelvoudige array:
<?php

$arr1 = array('Banaan', 'Appel', 'Peer', 'Ananas');

sort($arr1);

foreach($arr1 as $index => $value)
{
echo $index . ': ' . $value . '<br>';
}

?>

output:

0: Ananas
1: Appel
2: Banaan
3: Peer


Zoals je ziet is de array gesorteerd op alfabetische volgorde.
Nu een enkelvoudige associatieve array:
<?php

$arr2 = array('id' => 1, 'naam' => 'Frank', 'email' => '[email protected]');

// sorteer op de inhoud van de elementen
asort($arr2);

foreach($arr2 as $index => $value)
{
echo $index . ': ' . $value . '<br>';
}

echo '<br>';

// sorteer op de indexen id, naam en email
ksort($arr2);

foreach($arr2 as $index => $value)
{
echo $index . ': ' . $value . '<br>';
}

?>

output:

naam: Frank
email: [email protected]
id: 1

email: [email protected]
id: 1
naam: Frank


De eerste keer is de array gesorteerd op alfabetische volgorde.
De tweede keer is zijn de array indexen gesorteerd op alfabetische volgorde.

[size=xsmall]Toevoeging op 06/10/2014 17:31:05:[/size]

Nu gaan we naar een twee dimensionale array:
<?php

// een array waarin ieder element wederom een array is ofwel een twee dimensionale array
$arr3 = array(
array('id' => 3, 'naam' => 'Frank', 'email' => '[email protected]'),
array('id' => 1, 'naam' => 'Mario', 'email' => '[email protected]'),
array('id' => 2, 'naam' => 'Gert', 'email' => '[email protected]')
);

// probeer de array weer te geven:
foreach($arr3 as $index => $value)
{
echo $index . ': ' . $value . '<br>';
}


?>

output:

Notice: Array to string conversion in C:\xampp\www\arr.php on line 13
0: Array

Notice: Array to string conversion in C:\xampp\www\arr.php on line 13
1: Array

Notice: Array to string conversion in C:\xampp\www\arr.php on line 13
2: Array

Omdat ieder element in de buitenste array ook een array is kunnen we die niet zo weergeven.

[size=xsmall]Toevoeging op 06/10/2014 17:51:35:[/size]

We zullen een stapje verder moeten gaan en moeten zeggen 'Wat' we willen echoën uit de binnenste array:
<?php

// Dit is een manier om alles weer te geven:
foreach($arr3 as $index => $value)
{
// we geven gewoon alle elementen weer uit de binnenste array:
foreach($value as $index => $val)
{
echo $index . ': ' . $val . '<br>';
}
echo '<br>';
}

?>

output:

id: 1
naam: Frank
email: [email protected]

id: 3
naam: Mario
email: [email protected]

id: 2
naam: Gert
email: [email protected]


Ook kunnen we natuurlijk alleen de naam weergeven van ieder element:
<?php

foreach($arr3 as $index => $value)
{
echo $value['naam'] . '<br>';
}

?>

output:

Frank
Mario
Gert



[size=xsmall]Toevoeging op 06/10/2014 18:14:48:[/size]

Nu weer terug naar het sorteren:

Stel dat we nu weer de functie sort() of asort() willen gebruiken dan ontstaat het probleem dat deze functies alleen werken op de buitenste array en niet op de binnenste:
<?php

asort($arr3);

// Dit is een manier om alles weer te geven:
foreach($arr3 as $index => $value)
{
echo $index . ': ' . $value['naam'] . '<br>';
}

?>

output:

1: Mario
2: Gert
0: Frank

Dit geeft niet het gewenste resultaat. de asort() functie blijkt nog wel zo slim te zijn dat je elementen die een array zijn niet kunt sorteren. (array == array == array). Dus pakt de array het eerste element in de binnenste array, het id.
Echter willen wij niet op het id sorteren maar op naam. Er zit nu niets anders op om onze eigen sorteer algo op te geven aan de hand van een functie die door usort() meerdere malen wordt aangeroepen om zo alle elementen te kunnen sorteren.

Hier een voorbeeld van twee verschillende functies die beiden dezelfde array's anders sorteren:
<?php

function sortNaam($a, $b)
{
if($a['naam'] < $b['naam'])
return false;

return true;
}

function sortEmailReverse($a, $b)
{
if($a['email'] > $b['email'])
return false;

return true;
}

// een array waarin ieder element wederom een array is ofwel een twee dimensionale array
$arr3 = array(
array('id' => 3, 'naam' => 'Frank', 'email' => '[email protected]'),
array('id' => 1, 'naam' => 'Mario', 'email' => '[email protected]'),
array('id' => 2, 'naam' => 'Gert', 'email' => '[email protected]')
);

// sorteer de array op volgorde van naam van hoog naar laag
usort($arr3, 'sortNaam');

// dump de complete array op het scherm
echo '<pre>';
print_r($arr3);
echo '</pre>';

// sorteer de array op volgorde van email van LAAG naar HOOG
usort($arr3, 'sortEmailReverse');

// dump de complete array op het scherm
echo '<pre>';
print_r($arr3);
echo '</pre>';

?>

output:

Array
(
    [0] => Array
        (
            [id] => 3
            [naam] => Frank
            [email] => [email protected]
        )

    [1] => Array
        (
            [id] => 2
            [naam] => Gert
            [email] => [email protected]
        )

    [2] => Array
        (
            [id] => 1
            [naam] => Mario
            [email] => [email protected]
        )

)
Array
(
    [0] => Array
        (
            [id] => 1
            [naam] => Mario
            [email] => [email protected]
        )

    [1] => Array
        (
            [id] => 2
            [naam] => Gert
            [email] => [email protected]
        )

    [2] => Array
        (
            [id] => 3
            [naam] => Frank
            [email] => [email protected]
        )

)


Reageren