[PHP][Noob] array gebruiken in functie dmv global

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
Hoi,

Waarschijnlijk een simpel dingetje, maar ik kom er niet uit.

Ik heb een functie:
PHP-code:
PHP:
1
2
3
4
5
6
7
8
function lang($key) {
    global $lang2, $deblang;
    if (array_key_exists($key, $lang2)) return $lang2[$key];// . " [$key]";
    else {
      $deblang[] = $key;
      return "__" . $key . "__";
    }
  }

Voordat deze functie gemaakt wordt bestaat er al een array die lang2 heet.
(Dit is een array met zinnetjes: $lang['login'] = 'Inloggen'.)

Als ik nu de functie aanroep geeft php de volgende foutmelding:
Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object

Het werkt wel als ik de array binnen de functie maak. Het probleem zit dus echt in het global $lang2 gedeelte. Maar ik kan er niet achter komen wat. php.net afgespeurd en google omgekeerd.

Oftewel, hij herkent $lang2 niet, terwijl ik hem wel aanroep dmv global $lang2.

Ziet iemand mijn fout?

Groet,
Thom

Acties:
  • 0 Henk 'm!

  • Trucker Her
  • Registratie: Juni 2009
  • Niet online

Trucker Her

Someone ate my cookie :(

Ik zie geen fout maar weet wel een alternatief:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
function lang($key) { 
    global $lang2, $deblang; 
    if (isset($lang2[$key])) return $lang2[$key];// . " [$key]"; 
    else { 
      $deblang[] = $key; 
      return "__" . $key . "__"; 
    } 
  } 
?>

Gestoord word je toch...


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Mwah, isset versus array_key_exists gaat niet veel uitmaken, het laatste is zelfs netter. Zet voor de grap eens boven die regel een var_dump($lang2), goed kans dat die "null" of "string: " gaat zeggen.

Oh ja, Waar hoort mijn topic?.
>>> PRG

[ Voor 5% gewijzigd door MueR op 27-02-2010 18:41 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 16:45
Thomzh schreef op zaterdag 27 februari 2010 @ 18:02:
Voordat deze functie gemaakt wordt bestaat er al een array die lang2 heet.
(Dit is een array met zinnetjes: $lang['login'] = 'Inloggen'.)
$lang of $lang2?

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
-Alternatief werkt niet.

-de var_dump geeft inderdaad een NULL terug. En sorry voor verkeerd geplaatste topic.

-het is $lang2, ik had een typfout gemaakt, maar dat maakt niets uit voor de rest van het script.

Aangezien het probleem niet in array_key_exists zit. En als ik voor ik de functie aanroep gewoon $lang2 kan dumpen met print_r (en een mooie array terug krijg) moet het probleem toch in het overbrengen van de array in de functie zitten. Iemand nog een idee?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het lijkt erop dat $lang2 een variabele in een functie is waarvandaan je deze functie aanroept. Dat is geen global... Lees variables scope eens door. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Welke PHP versie gebruik je (kan me haast niet voorstellen dat het verschil gaat maken trouwens)? Global reference zou gewoon moeten werken.
pedorus schreef op zaterdag 27 februari 2010 @ 20:04:
Het lijkt erop dat $lang2 een variabele in een functie is waarvandaan je deze functie aanroept. Dat is geen global... Lees variables scope eens door. ;)
PHP:
2
global $lang2, $deblang;

Lees het topic eens goed?

[ Voor 58% gewijzigd door MueR op 27-02-2010 20:07 ]

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Trucker Her
  • Registratie: Juni 2009
  • Niet online

Trucker Her

Someone ate my cookie :(

Hij bedoelt dat er in een andere functie waar geen global in staat de variables worden aangemaakt denk ik.

Gestoord word je toch...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

MueR schreef op zaterdag 27 februari 2010 @ 20:06:
Welke PHP versie gebruik je (kan me haast niet voorstellen dat het verschil gaat maken trouwens)? Global reference zou gewoon moeten werken.

[...]

PHP:
2
global $lang2, $deblang;

Lees het topic eens goed?
Pedorus bedoelt dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
function foo() {
  $lang2 = file('languagefile.txt');
  bar();
}

function bar() {
  global $lang2;

  var_dump(lang2);
}

foo();

Dat zal, uiteraard, null afdrukken. :)

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

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Mogelijk, maar daar heeft TS geen info over gegeven, dus daar ga ik niet van uit. TS is bekend met de variable scope, dus zal hij vast ook hebben gedacht aan het gebruiken van het global keyword als $lang2 wordt aangemaakt.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Trucker Her
  • Registratie: Juni 2009
  • Niet online

Trucker Her

Someone ate my cookie :(

TS geeft ook aan dat het een noob vraag is dus zou best kunnen dat TS is vergeten global in de andere functie te zetten ALS die gebruikt word. Anders is het nog erger gissen.
On-topic:"
@TS Kun je ook het stukje script posten waarmee je $lang2 aanmaakt?

Gestoord word je toch...


Acties:
  • 0 Henk 'm!

  • base_
  • Registratie: April 2003
  • Laatst online: 18-09 13:23
Als je die global opnieuw definieert is die dan niet leeg en nog geen array? Als hij al bestaat zou ik hem iig niet opnieuw definieren edit: @hieronder: oops klopt, fout van mij, zit niet op te letten

[ Voor 19% gewijzigd door base_ op 27-02-2010 20:25 ]


Acties:
  • 0 Henk 'm!

  • Trucker Her
  • Registratie: Juni 2009
  • Niet online

Trucker Her

Someone ate my cookie :(

Je defineert niet met global, je zegt alleen dat die de globale variable moet gebruiken.

Gestoord word je toch...


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
MueR schreef op zaterdag 27 februari 2010 @ 20:14:
Mogelijk, maar daar heeft TS geen info over gegeven, dus daar ga ik niet van uit. TS is bekend met de variable scope, dus zal hij vast ook hebben gedacht aan het gebruiken van het global keyword als $lang2 wordt aangemaakt.
Tsja, het is toch wel toevallig dat je natuurlijk precies deze foutmelding krijgt als je het bestand zo af maakt: :p
PHP:
9
10
11
12
13
14
function test() {
   $lang2 = array('a' => 'b', 'c' => 'd');
   //$GLOBALS["lang2"] = $lang2;
   echo lang('a');
}
test();

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
uit de reacties op php.net op het variable scope article.
Note that if you declare a variable in a function, then set it as global in that function, its value will not be retained outside of that function
Dit is bij mij dan weer niet zo, zie volgend voorbeeld:

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
<?

global $globalvar;
$globalvar[0] = "oude waarde";

function writeglobal($value) {
    $globalvar[0]=$value;
}

writeglobal("nieuwe waarde");
echo $globalvar[0]."<br>";



$globalvar2[0] = "oude waarde";

function writeglobal2($value) {
    global $globalvar2;
    $globalvar2[0]=$value;
}

writeglobal2("nieuwe waarde");
echo $globalvar2[0]."<br>";

?>


Output:

code:
1
2
oude waarde
nieuwe waarde

Ik gok dat dit nogal php versie afhankelijk is (php4 vs php5).

[ Voor 15% gewijzigd door Mental op 27-02-2010 20:32 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Dat komt omdat je het verkeerd om doet :P
PHP:
1
2
3
4
function writeglobal2($value) {
    $globalvar2[0]=$value;
    global $globalvar2;
}

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
MueR schreef op zaterdag 27 februari 2010 @ 20:36:
Dat komt omdat je het verkeerd om doet :P
PHP:
1
2
3
4
function writeglobal2($value) {
    $globalvar2[0]=$value;
    global $globalvar2;
}
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
<?

global $globalvar;
$globalvar[0] = "oude waarde";

function writeglobal($value) {
    $globalvar[0]=$value;
}

writeglobal("nieuwe waarde");
echo $globalvar[0]."<br>";



$globalvar2[0] = "oude waarde";

function writeglobal2($value) {
    global $globalvar2;
    $globalvar2[0]=$value;
}

writeglobal2("nieuwe waarde");
echo $globalvar2[0]."<br>";


$globalvar3[0] = "oude waarde";

function writeglobal3($value) {
    $globalvar3[0]=$value;
    global $globalvar3;
}

writeglobal3("nieuwe waarde");
echo $globalvar3[0]."<br>";


?>


code:
1
2
3
oude waarde
nieuwe waarde
oude waarde


Dus nee.
Hoewel php een ranzige taal is hebben ze dus het declareren van variabelen (in het geval van global vars) wel redelijk normaal geimplementeerd.

[ Voor 7% gewijzigd door Mental op 27-02-2010 20:38 ]


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
Hier stond onzin ;)

[ Voor 90% gewijzigd door Mental op 27-02-2010 20:45 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

Ehm, Mental, moet je me even uitleggen. Je post een stuk waarbij je zegt dat iets bij jou niet werkt zoals op de php manual staat. De quote die jij post zegt namelijk dat wanneer je een variabele als global defineert nadat je er een waarde aan hebt gegeven (binnen een functie), die waarde niet wordt behouden. Het stuk code wat je in eerste instantie post is gewoon goed, maar raakt het verhaal uit de door jou gequote comment niet.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Mental
  • Registratie: Maart 2000
  • Laatst online: 20-10-2020
Ik doelde op
its value will not be retained outside of that function
Originele waardes zijn weg maar nieuwe (global) waarde is wel uitleesbaar buiten de functie ;)

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
<?

global $globalvar;
$globalvar[0] = "oude waarde";
$globalvar[1] = "oude waarde";

function writeglobal($value) {
    $globalvar[0]=$value;
}

writeglobal("nieuwe waarde");
echo $globalvar[0]."<br>";
echo $globalvar[1]."<br><br>";



$globalvar2[0] = "oude waarde";
$globalvar2[1] = "oude waarde";

function writeglobal2($value) {
    global $globalvar2;
    $globalvar2[0]=$value;
}

writeglobal2("nieuwe waarde");
echo $globalvar2[0]."<br>";
echo $globalvar2[1]."<br><br>";

?>


code:
1
2
3
4
5
oude waarde
oude waarde

nieuwe waarde
oude waarde


Dus je moet een var binnen de functie als global declareren om de variabele aan te spreken binnen die functie.
Ik verwarde mezelf inderdaad nogal ;)

Maarrrr, dat doet de TS ook dus het zal ergens anders wel fout gaan.
Rest van de code zou handig zijn.

[ Voor 72% gewijzigd door Mental op 27-02-2010 20:59 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Laten we maar ophouden met dit topic kapen door een zijdelings gerelateerde discussie erin te proppen en gewoon even afwachten wat de TS te zeggen heeft. :)

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

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een beetje zijdelings op Mental (sorry! ;)) en een andere mogelijkheid van wat er hier mis kan zijn gegaan: global $var kun je eigenlijk gewoon zien als een shortcut voor $var=&$GLOBALS["var"]; Het is dus een zogenaamde referentie. Dus wat Mental ziet is weinig bijzonders, en het volgende levert dus ook de fout op, hoewel we wel netjes lang2 als global 'definiëren':
PHP:
9
10
11
12
13
14
15
16
function test () {
   global $lang2; //equivalent of $lang2 = &$GLOBALS["lang2"];
   $lang = array('a' => 'b', 'c' => 'd');
   $lang2 = &$lang; //new reference set(!)
   print_r($lang2); //gives Array ( [a] => b [c] => d ) 
   echo lang('a'); //gives Warning: array_key_exists() [function.array-key-exists]: ...
}
test();

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Thomzh
  • Registratie: Oktober 2007
  • Laatst online: 17-11-2024
De helft van jullie verhaal heb ik niet begrepen. Dat geeft niet omdat het probleem opgelost is!

De array $lang2 werd aangemaakt in een geinclude phpbestand, dus niet in een andere functie. Wat ik gedaan heb is bovenaan dat bestand global $lang2; gezet en het werkte.

Nu weet ik nog steeds niet hoe het probleem veroorzaakt is en waarom het nu opgelost is, als iemand me dat zou willen vertellen ben ik je eeuwig dankbaar! ;-)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Dan roep je waarschijnlijk de include binnen een functie, of binnen een klasse aan. In de php-manual staan hier een aantal comments over, bijvoorbeeld deze en deze. Overigens kloppen niet alle comments, maar deze wel. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1