Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Scope van array_pop()

Pagina: 1
Acties:

Onderwerpen


  • Xuj
  • Registratie: November 2009
  • Laatst online: 05-06 11:08
Beste mede-tweakers,

Ik begrijp het volgende probleem niet.


PHP: voorbeeld_1.php
1
2
3
4
5
6
<?php
    $array = array(0, 1, 2, 3);

    echo array_pop($array); // 3
    echo array_pop($array); // 2
?>

PHP: voorbeeld_2.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php

    function foo($bar){
        $foo = array_pop($bar);
        return $foo;
    }

    $array = array(0, 1, 2, 3);

    echo foo($array); // 3
    echo foo($array); // 3
?>


Zou die array_pop() mijn $bar niet een waarde korter moeten maken?
Het is natuurlijk binnen een functie, maar $array wordt toch als waarde meegegeven aan de functie?


Oplossing:
PHP: oplossing.php
1
2
3
4
5
6
7
8
9
10
11
12
<?php

    function foo($bar){
        $foo = array_pop($bar);
        return $foo;
    }

    $array = array(0, 1, 2, 3);

    echo foo(&$array); // 3
    echo foo(&$array); // 2
?>

[ Voor 16% gewijzigd door Xuj op 01-01-2011 04:22 . Reden: Opgelost met dank aan Freeaqingme en naam ]


  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 21:25
het wordt wel als waarde meegegeven, maar je array wordt eerst in het geheugen gekopieerd omdat je geen reference gebruikt.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


  • naam
  • Registratie: Oktober 2007
  • Laatst online: 05-11 17:53
Je geeft de array niet als reference mee aan je functie, maar als normaal argument, hierdoor gebruikt de functie een kopie van de originele array.

Om in php een object by reference mee te geven moet je er een & voorzetten.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

    function foo($bar){
        $foo = array_pop($bar);
        return $foo;
    }

    $array = array(0, 1, 2, 3);

    echo foo(&$array); // 3
    echo foo(&$array); // 3

?>


edit:
Damn you Freeaqingme :p

[ Voor 4% gewijzigd door naam op 01-01-2011 03:56 ]


  • Xuj
  • Registratie: November 2009
  • Laatst online: 05-06 11:08
Ah zo!

Vriendelijk dank.

@naam
Wel goed de ampersand voor $array gezet, maar vergeten de tweede comment aan te passen. ^_^

Het verbaast me overigens dat er nog zo veel tweakers online zijn op dit tijdstip. :O

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 21:25
Xuj schreef op zaterdag 01 januari 2011 @ 04:02:
Het verbaast me overigens dat er nog zo veel tweakers online zijn op dit tijdstip. :O
Afaik leven echte tweakers 's nachts. Daarom leven ze ook in kelders, hebben ze over dag als 't buiten licht is zo min mogelijk last van licht.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 28-11 19:10
Je kan ook dit doen, is wat makkelijker dan foo(&$array) overal wegzetten.

PHP:
1
2
3
4
function foo(&$bar)
{
    //code
}

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

X_lawl_X schreef op zaterdag 01 januari 2011 @ 09:33:
Je kan ook dit doen, is wat makkelijker dan foo(&$array) overal wegzetten.

PHP:
1
2
3
4
function foo(&$bar)
{
    //code
}
Sterker nog: dat is de enige manier waarop het eigenlijk moet:
Note: There is no reference sign on a function call - only on function definitions. Function definitions alone are enough to correctly pass the argument by reference. As of PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);.

'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.

Pagina: 1