[php] array uitlezen

Pagina: 1
Acties:
  • 924 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 54899

Topicstarter
code:
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
29
$prijzen =
Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
            [1] => 37.50
            [2] => 12.50
            [3] => 57.50
        )

    [2] => Array
        (
            [1] => 42.50
            [2] => 12.50
            [3] => 62.50
        )

    [3] => Array
        (
            [1] => 37.50
            [2] => 12.50
            [3] => 57.50
        )

)


deze array heb ik gemaakt.
nu wil ik "gewoon" $prijzen[1][2] laten printen, komt die achter parser met een array(2) aanzetten.

wat doe ik verkeerd?

Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 26-05 13:47
{$prijzen[1][2]} gebruiken

offtopic:
omdat ik gok dat je iets van echo "$prijzen[1][2]" probeert...

[ Voor 62% gewijzigd door mjax op 14-08-2006 14:23 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
offtopic:
Moeten er geen komma's tussen de elementen staan?

Verder doet de code het bij mij wel:
PHP:
1
2
$prijzen = array(array(), array(37.50, 12.50, 57.50), array(42.50, 12.50, 62.50), array(37.50, 12.50, 57.50) );
echo $prijzen[1][2];
Geeft netjes 57.50. Omdat de index van de 2e sub-array natuurlijk ook met een 0 begint is het 57,50. $prijzen[1][1] zou 12,50 aangeven.

Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-06 21:13

Equator

Crew Council

#whisky #barista

Mithras86 schreef op maandag 14 augustus 2006 @ 14:32:
offtopic:
Moeten er geen komma's tussen de elementen staan?
print_r($arraynaam) geeft een dergelijk leesbare uitvoer..
Verder doet de code het bij mij wel:
PHP:
1
2
$prijzen = array(array(), array(37.50, 12.50, 57.50), array(42.50, 12.50, 62.50), array(37.50, 12.50, 57.50) );
echo $prijzen[1][2];
Geeft netjes 57.50. Omdat de index van de 2e sub-array natuurlijk ook met een 0 begint is het 57,50. $prijzen[1][1] zou 12,50 aangeven.
Met de code is niets mis, waarschijnlijk snapt zijn "parser" geen multidimensionale array's

Ik zoek nog een engineer met affiniteit voor Security in de regio Breda. Kennis van Linux, Endpoint Security is een pré. Interesse, neem contact met me op via DM.


Acties:
  • 0 Henk 'm!

Anoniem: 54899

Topicstarter
mjax schreef op maandag 14 augustus 2006 @ 14:22:
{$prijzen[1][2]} gebruiken

offtopic:
omdat ik gok dat je iets van echo "$prijzen[1][2]" probeert...
Dit is het.
Willen de { } iets zeggen of heb je hier een php.net link van??

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Variable parsing

When a string is specified in double quotes or with heredoc, variables are parsed within it.

There are two types of syntax: a simple one and a complex one. The simple syntax is the most common and convenient. It provides a way to parse a variable, an array value, or an object property.

The complex syntax was introduced in PHP 4, and can be recognised by the curly braces surrounding the expression.
http://nl2.php.net/types.string

Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-06 21:13

Equator

Crew Council

#whisky #barista

{} vertellen de parser dat er een variabele tussen staat.

PHP:
1
2
3
4
$mijnvar = "blaat";
echo 'Deze zin bevat een variable $mijnvar'; //prints $myvar
echo "Deze zin bevat een variabele $mijnvar"; //prints blaat
echo "Deze zin bevat een variabele {$mijnvar}"; //prints blaat

Ik zoek nog een engineer met affiniteit voor Security in de regio Breda. Kennis van Linux, Endpoint Security is een pré. Interesse, neem contact met me op via DM.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21:17

Janoz

Moderator Devschuur®

!litemod

Maar imho is nog de meest nette variant (aangezien je duidelijk ziet welk deeol variabel en welk deel constant is) de volgende:
PHP:
1
2
3
4
<?php 
$mijnvar = "blaat"; 
echo "Deze zin bevat een variabele ".$mijnvar; 
?>

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Anoniem: 54899

Topicstarter
ik weet dat ' niet geparsed wordt en " wel maar { nog nooit van gehoord of gelezen.

@janoz: vooral als er veel vars in een zin voorkomen is het vind ik het niet meer duidelijk:

PHP:
1
echo "Beste $naam, U bent om $datum van harte welkom op het evenement: $evenement met $aantal personen";

of
PHP:
1
echo "Beste ".$naam.", U bent om ".$datum." van harte welkom op het evenement: ".$evenement."  met ".$aantal." personen";

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Anoniem: 54899 schreef op maandag 14 augustus 2006 @ 15:32:
@janoz: vooral als er veel vars in een zin voorkomen is het vind ik het niet meer duidelijk:
Juist die onderste regel is dan toch veel duidelijker? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Anoniem: 54899 schreef op maandag 14 augustus 2006 @ 15:32:
ik weet dat ' niet geparsed wordt en " wel maar { nog nooit van gehoord of gelezen.

@janoz: vooral als er veel vars in een zin voorkomen is het vind ik het niet meer duidelijk:

PHP:
1
echo "Beste $naam, U bent om $datum van harte welkom op het evenement: $evenement met $aantal personen";

of
PHP:
1
echo "Beste ".$naam.", U bent om ".$datum." van harte welkom op het evenement: ".$evenement."  met ".$aantal." personen";
Misschien wil je even kijken naar formatters, zoals sprintf en printf.

Acties:
  • 0 Henk 'm!

Anoniem: 54899

Topicstarter
duidelijk als je het puur naar die regel bekijkt wel.
maar ik vind zo'n regel niet zo moeilijk om te lezen en gebruik daarom vaak de "" versie.
@proto, dat ken ik ja, maar is vaak te veel werk vind ik.

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 31-05 09:09
Daarnaast, met een template systeem zoals Smarty heb je echo / print / sprintf / etc niet eens meer nodig. De enige plek waar ik tegenwoordig nog variabelen in strings gebruik zijn SQL-queries.

Daar zet ik trouwens gewoon variabelen in de string met dubbele quotes, vind ik persoonlijk veel mooier om naar te kijken.

Ik weet niet of het ook efficienter is dan contantenaten (als dat de juiste term is voor het aan elkaar plakken van twee strings), daarmee heb je eigenlijk drie verschillende strings die je PHP aan elkaar vast laat knopen.

Ik heb ergens een online boek over PHP gelezen, met een hoofdstuk over optimaliseren (hiero), en daarin stond een handige optimalisatie voor meerdere dingen echo-en. In plaats van de strings aan elkaar te plakken met punten in een echo-statement, kun je een komma gebruiken - echo ondersteunt meerdere argumenten.

Met andere woorden, ipv

PHP:
1
echo "Hoi". $naam ." Je laatste bezoek was ". $laatstebezoeketc ." enzo";


doe je

PHP:
1
 echo echo "Hoi", $naam, " Je laatste bezoek was ", $laatstebezoeketc, " enzo";


Volgens mij had ik dat getest, en het was inderdaad een stuk(je) sneller.

Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 26-05 13:47
YopY schreef op dinsdag 15 augustus 2006 @ 10:56:
Met andere woorden, ipv

PHP:
1
echo "Hoi". $naam ." Je laatste bezoek was ". $laatstebezoeketc ." enzo";


doe je

PHP:
1
 echo echo "Hoi", $naam, " Je laatste bezoek was ", $laatstebezoeketc, " enzo";


Volgens mij had ik dat getest, en het was inderdaad een stuk(je) sneller.
Volgens mijn testen is juist concatenatie met de . operator sneller. Zie deze code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
define('LOOP_COUNT', 1000000);

$naam = 'MJAX';
$laatstebezoeketc = 'gisteren';

$start = time();
for($i = 0 ; $i < LOOP_COUNT ; $i++) {
    echo "Hoi".$naam." Je laatste bezoek was ".$laatstebezoeketc." enzo";
}
$concat_time = time()-$start;

$start = time();
for($i = 0 ; $i < LOOP_COUNT ; $i++) {
    echo "Hoi",$naam," Je laatste bezoek was ",$laatstebezoeketc," enzo";
}
$comma_time = time()-$start;

echo "CONCAT: ".$concat_time." (".LOOP_COUNT." operations)\n\n";
echo "COMMA: ".$comma_time." (".LOOP_COUNT." operations)\n\n";
?>


Deze levert op mijn machine een tijd van 70 sec. voor de . operator en 174 sec. voor de , operator.

Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 26-05 13:47
Voor de volledigheid heb ik mijn test uitgebreid met inline en sprintf constructies. De uitslag is nu:

code:
1
2
3
4
CONCAT: 72 (1000000 operations)
COMMA: 308 (1000000 operations)
INLINE: 78 (1000000 operations)
SPRINTF: 77 (1000000 operations)
De getoonde waardes zijn secondes.

Opvallend vind ik dat de methode waarvan YopY beweert dat deze het snelste is, met afstand het langzaamst is. De andere methods verschillen qua timing zo weining dat je hier gerust je persoonlijk voorkeur kunt gebruiken, zonder je zorgen te maken om performance. Gebruik dus in elk geval niet de , (comma) operator.

De bijbehorende code die deze output heeft geleverd is:

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
29
30
31
32
33
34
35
<?
define('LOOP_COUNT', 1000000);

$naam = 'MJAX';
$laatstebezoeketc = 'gisteren';

$start = time();
for($i = 0 ; $i < LOOP_COUNT ; $i++) {
    echo "Hoi".$naam." Je laatste bezoek was ".$laatstebezoeketc." enzo";
}
$concat_time = time()-$start;

$start = time();
for($i = 0 ; $i < LOOP_COUNT ; $i++) {
    echo "Hoi",$naam," Je laatste bezoek was ",$laatstebezoeketc," enzo";
}
$comma_time = time()-$start;

$start = time();
for($i = 0 ; $i < LOOP_COUNT ; $i++) {
    echo "Hoi $naam Je laatste bezoek was $laatstebezoeketc enzo";
}
$inline_time = time()-$start;

$start = time();
for($i = 0 ; $i < LOOP_COUNT ; $i++) {
    echo sprintf("Hoi %s Je laatste bezoek was %s enzo", $naam, $laatstebezoeketc);
}
$sprintf_time = time()-$start;

echo "CONCAT: ".$concat_time." (".LOOP_COUNT." operations)\n\n";
echo "COMMA: ".$comma_time." (".LOOP_COUNT." operations)\n\n";
echo "INLINE: ".$inline_time." (".LOOP_COUNT." operations)\n\n";
echo "SPRINTF: ".$sprintf_time." (".LOOP_COUNT." operations)\n\n";
?>

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Ik heb totaal wat anders :p

code:
1
2
3
4
CONCAT: 31 (1000000 operations) 
COMMA: 66 (1000000 operations) 
INLINE: 118 (1000000 operations) 
SPRINTF: 160 (1000000 operations)

March of the Eagles


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Pffff, wat een problemen om niets weer ;) Als je zonodig moet benchmarken omdat je die paar fracties van een seconde waardeert, doe het dan wel onder gelijke omstandigheden; de laatste test heeft in deze benchmark (de sprintf) iig op dit moment het "meeste" nadeel :P (Mind the quotes).
Dan even zonder ongein, kies in dit geval voor een oplossing die jij het meest leesbaar acht... en pas wanneer je performance problemen krijgt kun je hier eventueel naar terug willen kijken. In het algemeen zeiden twee wijsmannen ooit: "Premature optimizing is the root of all evil".

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Idd. Hoe vaak komt het nou voor dat je zo veel strings moet concatten dat het performance problemen gaat geven?

Ik ben het nog niet vaak tegen gekomen ieder geval.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1