end()
Door Kay Kay, 20 jaar geleden, 7.320x bekeken
Pak de laatste waarde in een array
Gesponsorde koppelingen
Inhoudsopgave
Er zijn 25 reacties op 'End'
Gesponsorde koppelingen
Wat een tutorial! Je zal wel zweten.
Een extensie ophalen kan veel makkelijker met string functies:
en voor arrays kan je veel makkelijker array_pop(); gebruiken als je het laatste deel wilt hebben.
Om de reden dat zoals gezegd de pointer ook naar het laatste element verplaatst wordt. Op zich geen probleem maar als je geen foreach(); gebruikt maar wel dezelfde lus, moet je de pointer weer gaan resetten.
foreach(); doet dat automatisch...
bekijk zelf maar:
pointers komen veel beter van pas met Iterators.
Kort samengevat zeer slechte tutorial!
Een extensie ophalen kan veel makkelijker met string functies:
Code (php)
en voor arrays kan je veel makkelijker array_pop(); gebruiken als je het laatste deel wilt hebben.
Om de reden dat zoals gezegd de pointer ook naar het laatste element verplaatst wordt. Op zich geen probleem maar als je geen foreach(); gebruikt maar wel dezelfde lus, moet je de pointer weer gaan resetten.
foreach(); doet dat automatisch...
bekijk zelf maar:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$test = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
while(list(, $value) = each($test)){
echo $value.'<br/>'.PHP_EOL;
}
//reset($test); //zonder deze reset gaat het niet werken!
while(list(, $value) = each($test)){
echo $value.'<br/>'.PHP_EOL;
}
//maar foreach weer wel
foreach($test as $value){
echo $value.'<br/>'.PHP_EOL;
}
?>
$test = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
while(list(, $value) = each($test)){
echo $value.'<br/>'.PHP_EOL;
}
//reset($test); //zonder deze reset gaat het niet werken!
while(list(, $value) = each($test)){
echo $value.'<br/>'.PHP_EOL;
}
//maar foreach weer wel
foreach($test as $value){
echo $value.'<br/>'.PHP_EOL;
}
?>
pointers komen veel beter van pas met Iterators.
Kort samengevat zeer slechte tutorial!
@Lode ja en het is geplaatst in de categorie PHP functies http://www.phphulp.nl/php/tutorials/4/ en als je daar eens in kijkt zie je allemaal van deze ??n blad 'tutorials'. De vraag of tutorial helemaal de juiste benaming is is idd wel discutabel.
@Danny
Heb je gelijk in!
En net als die pointer maakt dat in dit slechte voorbeeld niet uit natuurlijk.
Mocht het wel uitmaken, dan lijkt me nog makkelijker om array_reverse(); te nemen en dan key 0.
Maar zoals ik al aangaf kan het nog veel makkelijker met string functies als we naar het ophalen van een extensie kijken bijvoorbeeld.
@Webmakerij
Er zullen vast wel nuttige dingen in staan, maar dit gaat nergens over...
DELETE FROM tutorials WHERE cat=4 AND id=614;
Heb je gelijk in!
En net als die pointer maakt dat in dit slechte voorbeeld niet uit natuurlijk.
Mocht het wel uitmaken, dan lijkt me nog makkelijker om array_reverse(); te nemen en dan key 0.
Maar zoals ik al aangaf kan het nog veel makkelijker met string functies als we naar het ophalen van een extensie kijken bijvoorbeeld.
@Webmakerij
Er zullen vast wel nuttige dingen in staan, maar dit gaat nergens over...
DELETE FROM tutorials WHERE cat=4 AND id=614;
Quote:
Mja, daar heb je gelijk in maar dan zie ik wel graag een goede uitleg/beschrijving van de werking van de functie, want wat hier staat klopt gewoon niet!Deze heeft net-zo-veel recht en meerwaarde om hier te staan als 'include' (2), phpinfo en strrev
De functie end() is in eerste instantie bedoeld om de interne filepointer van een array naar de laatste index te verplaatsen. Dat daarbij toevallig die laatste waarde ook teruggegeven wordt is leuk, maar dat is zeker niet het doel van deze functie.
Quote:
Als je een manier zoekt om de laatste waarde uit een array te halen, zijn er ook wel andere manieren te bedenken. Een aantal daarvan worden hier al aangedragen...Als je op deze site zoekt naar laatste array oid, dan komen er geen bruikbare resultaten.
... zooo naief. Maar goed, back on topic.
Ik snap hoe end() werkt, maar ik kom er maar niet achter hoe end() in combinatie met bijvoorbeeld een ArrayObject instantie werkt. Het werkt wel, maar ik kan geen enkele method aanroep terugzien (denk aan: ArrayObject extenden en iedere method overschijven zodat deze een kik geeft & daarna het resultaat van z'n parent teruggeeft) Daar ben ik dan wel weer benieuwd naar.
Ik snap hoe end() werkt, maar ik kom er maar niet achter hoe end() in combinatie met bijvoorbeeld een ArrayObject instantie werkt. Het werkt wel, maar ik kan geen enkele method aanroep terugzien (denk aan: ArrayObject extenden en iedere method overschijven zodat deze een kik geeft & daarna het resultaat van z'n parent teruggeeft) Daar ben ik dan wel weer benieuwd naar.
@Jelmer
end werkt niet met een instance van ArrayObject. ArrayObject implementeerd een (Array)Iterator.
Iterators hooken rechtstreeks in de Zend2 engine. En maken het mogenlijk om objecten te gebruiken in een lus...
functies als next(); current(); reset(); key(); heb je nodig als je zelf iterators gaat maken...
je zou dan ook end(); prev(); functionaliteit kunnen toevoegen...
Maar deze functies hebben geen directe controle op SPL spul...volgens mij...
Maare ik ga GEEN tutorial schrijven over SPL verder...
EDIT:
bij nader inzien werkt dat wel gewoon... dat wist ik ook niet niet.. hoewel ik er nog geen zinnige toepassing voor kan bedenken op het moment...
@Webmakkerij
Bas heeft het toch veelste druk met de nieuwe site, toch ? :-S
end werkt niet met een instance van ArrayObject. ArrayObject implementeerd een (Array)Iterator.
Iterators hooken rechtstreeks in de Zend2 engine. En maken het mogenlijk om objecten te gebruiken in een lus...
Code (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
36
37
38
39
40
41
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
36
37
38
39
40
41
<?php
class Persons extends ArrayIterator implements Countable{
protected $count = 0;
public function __construct(array $persons){
$this->count = count($persons, COUNT_NORMAL);
parent::__construct($persons);
}
/**
* countable engine hook...
*/
public function count(){
return $this->count;
}
}
$persons = array (
'ik',
'jij',
'hij',
'zij',
'wij'
);
$p = new Persons($persons);
foreach($p as $key => $value){
echo $key.' => '.$value.'<br/>'.PHP_EOL;
}
//ArrayIterator implements ArrayAccess.
//je kan dan wel de aanroep simuleren...
//soort overloading maar dan array stijl... ook een engine hook...
echo $p[0].'<br/>'.PHP_EOL; // => ik
//countable hook:
echo count($p).'<br/>'.PHP_EOL; // => 5
//ook leuk :-]
$p->reset(); //foreach triggert automatisch reset(); andere lussen niet!
for(; $p->valid(); $p->next()){
echo $p->key().' => '.$p->current().'<br/>'.PHP_EOL;
}
?>
class Persons extends ArrayIterator implements Countable{
protected $count = 0;
public function __construct(array $persons){
$this->count = count($persons, COUNT_NORMAL);
parent::__construct($persons);
}
/**
* countable engine hook...
*/
public function count(){
return $this->count;
}
}
$persons = array (
'ik',
'jij',
'hij',
'zij',
'wij'
);
$p = new Persons($persons);
foreach($p as $key => $value){
echo $key.' => '.$value.'<br/>'.PHP_EOL;
}
//ArrayIterator implements ArrayAccess.
//je kan dan wel de aanroep simuleren...
//soort overloading maar dan array stijl... ook een engine hook...
echo $p[0].'<br/>'.PHP_EOL; // => ik
//countable hook:
echo count($p).'<br/>'.PHP_EOL; // => 5
//ook leuk :-]
$p->reset(); //foreach triggert automatisch reset(); andere lussen niet!
for(; $p->valid(); $p->next()){
echo $p->key().' => '.$p->current().'<br/>'.PHP_EOL;
}
?>
functies als next(); current(); reset(); key(); heb je nodig als je zelf iterators gaat maken...
je zou dan ook end(); prev(); functionaliteit kunnen toevoegen...
Maar deze functies hebben geen directe controle op SPL spul...volgens mij...
Maare ik ga GEEN tutorial schrijven over SPL verder...
EDIT:
bij nader inzien werkt dat wel gewoon... dat wist ik ook niet niet.. hoewel ik er nog geen zinnige toepassing voor kan bedenken op het moment...
Code (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
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
<?php
class Persons extends ArrayIterator implements Countable{
protected $count = 0;
public function __construct(array $persons){
$this->count = count($persons, COUNT_NORMAL);
parent::__construct($persons);
}
/**
* countable engine hook...
*/
public function count(){
return $this->count;
}
}
$persons = array (
'ik',
'jij',
'hij',
'zij',
'wij'
);
$p = new Persons($persons);
echo end($p).'<br/>'.PHP_EOL;
echo prev($p).'<br/>'.PHP_EOL;
reset($p);
echo current($p).'<br/>'.PHP_EOL;
echo next($p).'<br/>'.PHP_EOL;
echo prev($p).'<br/>'.PHP_EOL;
?>
class Persons extends ArrayIterator implements Countable{
protected $count = 0;
public function __construct(array $persons){
$this->count = count($persons, COUNT_NORMAL);
parent::__construct($persons);
}
/**
* countable engine hook...
*/
public function count(){
return $this->count;
}
}
$persons = array (
'ik',
'jij',
'hij',
'zij',
'wij'
);
$p = new Persons($persons);
echo end($p).'<br/>'.PHP_EOL;
echo prev($p).'<br/>'.PHP_EOL;
reset($p);
echo current($p).'<br/>'.PHP_EOL;
echo next($p).'<br/>'.PHP_EOL;
echo prev($p).'<br/>'.PHP_EOL;
?>
@Webmakkerij
Bas heeft het toch veelste druk met de nieuwe site, toch ? :-S
Ik heb even de broncode van PHP doorzocht, en volgens mij kan je geen eigen functionaliteit aan end toekennen door interfaces te implementeren (zoals mogelijk is bij foreach of arrayaccess) Echter kan je wel ArrayObject extenden, dan zal hij wel werken. Ik vermoed omdat ArrayObject een veredelde hashtable is.
In ieder geval, wanneer je een normaal object gebruikt als basis voor je klasse, dan zal end() de laatste property teruggeven. Extend je ArrayObject, dan gedraagt hij zich alsof het werkelijk een array is. Let wel dat hij vervolgens de functies van de ArrayObject gebruikt om de waarde eruit te trekken (of eigenlijk haalt hij de waarde direct uit de hashtable) en hij niet langs methods als offsetGet() en seek() komt.
Alles met alles kan je het gedrag van end() dus niet veranderen. Dat verklaart ook meteen waarom ik geen echo's kreeg toen ik een uitbreiding op ArrayObject had gemaakt welke alle methods van ArrayObject had (en doorgaf aan ArrayObject zelf) met daarin een echo. end() leest direct uit de hashtable. Vreemd genoeg current() ook, dus ik twijfel nog een beetje aan mijn bevindingen.
edit: viel me net op, ArrayObject kent flags. 2 op het moment van schrijven. Met die flags kan je bepalen of hij de standaard property list moet benaderen (de properties van een object) of de interne array. Ik denk dat je op die manier het gedrag van ArrayObject deels kan veranderen (en zo ook misschien wel indirect end) maar ik heb het nog niet geprobeerd.
In ieder geval, wanneer je een normaal object gebruikt als basis voor je klasse, dan zal end() de laatste property teruggeven. Extend je ArrayObject, dan gedraagt hij zich alsof het werkelijk een array is. Let wel dat hij vervolgens de functies van de ArrayObject gebruikt om de waarde eruit te trekken (of eigenlijk haalt hij de waarde direct uit de hashtable) en hij niet langs methods als offsetGet() en seek() komt.
Alles met alles kan je het gedrag van end() dus niet veranderen. Dat verklaart ook meteen waarom ik geen echo's kreeg toen ik een uitbreiding op ArrayObject had gemaakt welke alle methods van ArrayObject had (en doorgaf aan ArrayObject zelf) met daarin een echo. end() leest direct uit de hashtable. Vreemd genoeg current() ook, dus ik twijfel nog een beetje aan mijn bevindingen.
edit: viel me net op, ArrayObject kent flags. 2 op het moment van schrijven. Met die flags kan je bepalen of hij de standaard property list moet benaderen (de properties van een object) of de interne array. Ik denk dat je op die manier het gedrag van ArrayObject deels kan veranderen (en zo ook misschien wel indirect end) maar ik heb het nog niet geprobeerd.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
Inhoudsopgave
Labels
- Geen tags toegevoegd.
PHP hulp
0 seconden vanaf nu