end()

Door Kay Kay, 20 jaar geleden, 7.265x bekeken

Pak de laatste waarde in een array

Gesponsorde koppelingen

Inhoudsopgave

  1. end()

 

Er zijn 25 reacties op 'End'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


20 jaar geleden
 
0 +1 -0 -1
Merk op dat de pointer van de array ook wordt verplaatst naar het laatste element in de array.
Misschien kan je direct, current, each, next, prev en reset erbij documenteren?
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Zie ook alle andere array functies op php.net.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
Wat een tutorial! Je zal wel zweten.

Een extensie ophalen kan veel makkelijker met string functies:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
function extension($filename){
   if(($ext = strrchr($str, '.'))){
       return substr($ext, 1);
   }

   return NULL;
}

?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>


pointers komen veel beter van pas met Iterators.

Kort samengevat zeer slechte tutorial!
Kay Kay
Kay Kay
20 jaar geleden
 
0 +1 -0 -1
Het is geen tutorial :S, het is een uitleg van een functie.
Hoe wil je het anders uitleggen?
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Quote:
Hoe wil je het anders uitleggen?
Met alle respect, een linkje naar de betreffende functie op php.net zegt net zo veel, zo niet beter...
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
staat toch echt onder het kopje: Laatste php Tutorials...
Kwastie
Kwastie
20 jaar geleden
 
0 +1 -0 -1
ik wist niet eens dat deze functie bestond..

ik deed altijd count($array) -1;
Bo az
Bo az
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$ext
= pathinfo('bestandsnaam.ext', PATHINFO_EXTENSION);
?>
Danny K
Danny K
20 jaar geleden
 
0 +1 -0 -1
@Kwastie: er is ook een cruciaal verschil! Met jou methode blijft de laatste waarde intact! Bij array_pop(); wordt de laatste waarde terug gegeven maar ook uit de array verwijderd!


20 jaar geleden
 
0 +1 -0 -1
@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.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
@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;
Kay Kay
Kay Kay
20 jaar geleden
 
0 +1 -0 -1
Oke.. dan gaat het niet over de extentie.. het is maar een voorbeeld hoor :S

Als je op deze site zoekt naar laatste array oid, dan komen er geen bruikbare resultaten. Ik had het nodig en kon het niet op deze site vinden.. andere mensen miss ook wel.


20 jaar geleden
 
0 +1 -0 -1
@Lode
Deze heeft net-zo-veel recht en meerwaarde om hier te staan als 'include' (2), phpinfo en strrev
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Quote:
Deze heeft net-zo-veel recht en meerwaarde om hier te staan als 'include' (2), phpinfo en strrev
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!

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 op deze site zoekt naar laatste array oid, dan komen er geen bruikbare resultaten.
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...
- -
- -
20 jaar geleden
 
0 +1 -0 -1
Over die extensie nog: naast dat het veel handiger kan, werkt dit niet. Neem een .tar.gz bestand (een soort ZIP, het is tenminste gecomprimeerde meuk), jouw systeem zal zeggen dat de extensie .gz is. Niet dus.
Hipska BE
Hipska BE
20 jaar geleden
 
0 +1 -0 -1
@Jonathan: daar is discutie over mogelijk hoor. Het is een Tar die ge-Gzipped is. Dus is hij eig wel een .gz

Eerst worden bestanden in een .tar gestoken, daarna in een .gz (omdat gzip maar 1 bestand kan comprimeren in tegenstelling tot tar,zip,rar,sitx, ... )
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Een tar.gz is gewoon een gzip-bestand. Pas na het unzippen houd je een archief over en dat is een tar. Dat Linux/WinRar/etc het toelaten om in 1 keer te unzippen en unpacken betekent niet dat het 1 extensie/bestandstype is. Dus dit is wel correct Jonathan ;-)
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
@webmakkerij
Als ik me moet uitlaten over deze site heb ik geen account meer morgen denk ik...

N.B.
Over een paar maandjes komt er van mijn kant iig een goed gescripte vervanger i.s.m. wat anderen.

Is dat sneller als onze bas ?
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
... 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.


20 jaar geleden
 
0 +1 -0 -1
@lode dat klinkt wel heel erg als ondermijning van het gezag; mogelijk concurrentie; afvallige; misschien moeten we nu maar beide gebruik maken van het delete knopje voor het geval bas het leest :-)
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
@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...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
}

?>


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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
?>


@Webmakkerij
Bas heeft het toch veelste druk met de nieuwe site, toch ? :-S
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
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.
Sander
Sander
20 jaar geleden
 
0 +1 -0 -1
Simpele en nuttige tutorial :)
Jason de Ridder
Jason de Ridder
20 jaar geleden
 
0 +1 -0 -1
End is een leuke en handige functie, maar wat sneller werkt is dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$array
= array('waarde1', 'waarde2', 'waarde3', 'waarde4');
echo $array[count($array) - 1]
// Output:
// waarde4

?>
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Vincent Swarte
Vincent Swarte
17 jaar geleden
 
0 +1 -0 -1
Bedankt, zocht redelijk lang hier naar.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. end()

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.