[PHP] Return array gaat verkeerd

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • IkBenAlles
  • Registratie: Januari 2002
  • Laatst online: 27-01-2022
Beste medetweakers,

Ik heb een script gemaakt welke highscores ophaalt uit een database. Vervolgens plaats ik de opgehaalde gegevens in een array. Op dit array doe ik vervolgens wat bewerkingen.

Nu is er iets raars aan de hand. Het script maakt gebruik van een recursieve methode.
Wanneer deze "klaar" is returnt deze de highscores (welke opgeslagen zijn in een multidimensionaal array).

Het returnen van het array gaat echter niet goed. Het lijkt wel alsof er helemaal niet gereturned wordt. En dan maakt het niet uit of ik het array probeer te returnen of een getal of een string.
Er wordt gewoon niets gereturned.

Het vreemde is, als ik een andere query gebruik om de highscores op te halen (aanpassen van 1 sql key statement namelijk 'NOT' erbij) dan werkt het wel.
Ik kom er echt niet uit. Het lijkt me zelfs gewoon een php bug.

Weten jullie toevallig waar het niet correct returnen van een variabele aan kan liggen?
Ik weet 100% zeker dat ik bij de return statement kom, en ik weet ook 100% zeker dat de variabele gevuld is. Toch werkt het echter niet.
Ik hoop dat jullie me kunnen helpen.

Groeten,
M

Het gaat om onderstaande code. Wanneer ik in de statement 1 woordje aanpas, namelijk 'NOT', dan werkt het opeens wel. Terwijl de query dan nog steeds dezelfde velden terug geeft en nog steeds genoeg resultaten teruggeeft. Erg vreemd.


Ik doe dus het voglende: Een gebruiker geeft op hoeveel highscores hij of zij terug wil krijgen van de functie. De functie voert vervolgens een query uit (haalt het dubbele aantal highscores op voor het gemak) en zet de verkregen highscores om in een multidimensionaal array.
Van dit array wordt vervolgens gecheckt of er dubbele highscores in voorkomen. Het is namelijk de bedoeling om van elke gebruiker alleen de hoogste highscore weer te geven.
Als er blijkt dat na alle dubelle records eruit te halen er niet genoeg overblijven (minder dan de opgegeven amount), dan wordt de functie nog een keer uitgevoerd. Hierbij worden dan de volgende highscores opgehaald. Dit gaat zo door tot er
1. Genoeg highscores zijn opgehaald
2. Er simpelweg niet genoeg highscores zijn (resultset is empty)

Op het eind return ik vervolgens het verkregen scoreArray, deze wordt echter niet goed teruggegeven. Het score array zit wel vol. Maar ik krijg simpelweg niks terug, dit terwijl ik toch echt wel bij de return statement kom. Als ik daar return 10 doe om het te testen dan werkt het nog steeds niet. Ik vind het in ieder geval erg vreemd. Weten jullie (met al je ervaring) misschien waar het aan ligt?

PHP: scorefunction
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 $blaat = filterScores($previousArray, $amount);
    echo 'blaat: '.$blaat;

    function filterScores($previousArray, $amount){
     $boolDone = false;
     
     $sql = "STATEMENT":
    
    
     
     //Because double entries will be removed by php, get the double amount of needed highscores
     
     //If this isnt the first time the funciton is called, then the previous time a lot of doubles were removed
     //Which lead to the amount of highscores remaining lower then the needed amount.
     //Get the next bunch of highscores
     //If this is the first time then get the top amount
     if(!empty($previousArray)){ 
      $doubleAmount = $amount * 2;
      $sql .= " LIMIT ".$doubleAmount.",".($doubleAmount*2);
      
     }else{
      $doubleAmount = $amount * 2;
      $sql .= " LIMIT ".$doubleAmount;
     }
     
      
     $result = mysql_query($sql) or die(mysql_error()); 
     
     
     //Make sure it doesnt stick in an endless loop (recursive function, recalls itself if amount of results left over isnt enough
     //But if there just arent any more results in the database then it will never have enough results. With this if statement this will not happen
     if(mysql_num_rows($result) > 0){
     
      $scoreArray;    
      $counter = 0;
     
      while ($row = mysql_fetch_array($result , MYSQL_ASSOC)) 
      {
       //Create multi dimensional results array
       //playername  trace_score  begintime  postcode
       $scoreArray[$counter] = array('playername' => $row['playername'],'trace_score' => $row['trace_score'], 'begintime' => $row['begintime'], 'postcode' => $row['postcode']); 
       $counter++;
      }
      
    
      //Splice out double records
      for ($i = 0; $i < count($scoreArray); $i++){
       
       //Row of scoreArray
       $scoreSubArray = $scoreArray[$i];
       
       //For the row check the whole array for a double
       for($n = 0; $n < count($scoreArray); $n++){
        
        //If double found (prevent the row itself is counted as a double).
        $scoreSubArray2 = $scoreArray[$n];
        
     
              
        if($scoreSubArray2['playername'] == $scoreSubArray['playername'] && $i != $n){
        
         //Splice it out.
         array_splice ($scoreArray, $n, 1);  
         $i--;
         //array_splice ($input, 1, -1);  
        }
       }
      }  
      
      echo 'count PreviousArray: '.count($previousArray);
      echo 'count scoreArray: '.count($scoreArray);
            
      //If there were records in the previous array (which means this isnt the first time the function is called, which means the function has called itself because
      //there werent enough results. Which means the previousArray is filled with valuable highscores
      //Paste the just gotten ScoreArray to the previousArray
      //If previous Array is empty then this is the first time the function is called.
      if (!empty($previousArray)){
       $startLength = count($previousArray);
       for ($p = 0; $p < count($scoreArray); $p++){
        $previousArray[startLength+$p] = $scoreArray[$p];
       }
      }else{
       $previousArray = $scoreArray;
      }
      
      //If the previousArray has lesser highscores then required then recall this function, else return the array
      if (count($previousArray) < $amount){
       filterScores($previousArray, $amount);
      }else{
       //echo ' RETURN '.count($previousArray).' <br>';
       $boolDone = true;
      }
     }else{
      //There just arent any more results, so just return it
      $boolDone = true;
     }
     
     
     if($boolDone){
      return $scoreArray;
//return 10, return 'blaat', return wat dan ook werkt simpelweg niet. Terwijl $boolDone wel true wordt... 

 
     }
    
    }

[ Voor 75% gewijzigd door IkBenAlles op 11-06-2007 14:13 ]

Samen staan we sterk!


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Stuk (voorbeeld) code..?

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • webinn
  • Registratie: Oktober 2002
  • Laatst online: 06-06 12:44
post eens wat code? :)

[ Voor 0% gewijzigd door webinn op 11-06-2007 12:59 . Reden: lap, secondje te laat ;) ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Debuggen: Hoe doe ik dat?
Verder: als je geen (relevante!) code post kunnen we er natuurlijk weinig over zeggen...

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

relevante code (en query) willen zeker helpen (in [ PHP ]-tags)?
edit:
Spuit 4

[ Voor 18% gewijzigd door hamsteg op 11-06-2007 13:02 ]

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 12:37

Gonadan

Admin Beeld & Geluid, Harde Waren
Een ideetje:

Loop je met een foreach loop door je array tijdens je bewerkingen?
Dan wordt er namelijk een kopie van je array gebruikt.
Je zal dan een pointer naar je array moeten gebruiken. :)

Look for the signal in your life, not the noise.

Canon R6 | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als iets niet werkt, zoek in eerste instantie uit waar je zelf een fout maakt ipv de omgeving/het taaltje de schuld te geven. ;)

Debug op tactische plekken, gebruik var_dump() om te kijken wat de variabelen op de kritieke punten voor waarden hebben. Bekijk het resultaat van de query in bijv. phpmyadmin.

Je verklaart nu nog niet welke standaard debug acties je ondernomen hebt. Pas als je dat gedaan hebt en er niet uitkomt, kan je de vraag hier neerleggen, maar dan wel met relevante code aangevuld met wellicht de waarde van bepaalde vars op bepaalde punten in het script.

{signature}


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je returned helemaal geen scores.

Je returned alleen het getal 10.
In je voorbeeldcode tenminste...

Ik gok dat je ten eerste regel 87 wilt veranderen in:
PHP:
1
return filterScores($previousArray, $amount);

of iets dergelijks, want op het moment doe je helemaal niks met je recursieve aanroep...

[ Voor 50% gewijzigd door Grijze Vos op 11-06-2007 13:30 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tja, recursie zonder return statements schiet niet op. :P

Overigens heb ik na zeer vluchtig over de lap code heen gekeken te hebben sterk het idee dat je dit niet handig aanpakt. Wellicht valt eea ook te ontdubbelen in je DB, een behoorlijk deel code is inefficient en dubbel, en je laatste statement bevat een magisch getal... :>
Een recursieve oplossing voor dit probleem ligt imo niet voor de hand. Alhoewel een aantal comments overbodig is, heb je er ook een aantal nodig om je onlogische aanpak uit te leggen. Denk in dat soort gevallen altijd nog een keer na over je aanpak, ipv. een comment neer te zetten.

Ik weet niet wat voor query je precies doet, maar ik vermoed dat wat je probeert te doen ook in een regeltje of 10-20 kan, regels welke beter leesbaar, logischer en efficienter zijn.

[ Voor 33% gewijzigd door Voutloos op 11-06-2007 13:29 ]

{signature}


Acties:
  • 0 Henk 'm!

  • IkBenAlles
  • Registratie: Januari 2002
  • Laatst online: 27-01-2022
Ik heb de startpost even geupdate. Voor het gemak even het een en ander uitgelegd.
De return statement werkt simpelweg niet wat gewoonweg behoorlijk raar en frustrerend is.

Samen staan we sterk!


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Het returnstatement werkt niet omdat je helemaal geen return statement hebt. Je moet goed beseffen dat elke aanroep aan de functie gewoon hetzelfde werkt. Het is dus neit zo dat je maar 1x ooit meot returnen, maar je moet bij elke aanroep van de functie zorgen dat er wat terug gegeven wordt.

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!

Verwijderd

Voutloos schreef op maandag 11 juni 2007 @ 13:24:
Tja, recursie zonder return statements schiet niet op. :P
Ik heb niet topic gelezen dus wellicht behoorlijk uit zijn context, maar:

bv: quicksort(array, begin, end) is redelijk recursief zonder return statement ;)

Acties:
  • 0 Henk 'm!

  • IkBenAlles
  • Registratie: Januari 2002
  • Laatst online: 27-01-2022
Janoz schreef op maandag 11 juni 2007 @ 14:18:
Het returnstatement werkt niet omdat je helemaal geen return statement hebt. Je moet goed beseffen dat elke aanroep aan de functie gewoon hetzelfde werkt. Het is dus neit zo dat je maar 1x ooit meot returnen, maar je moet bij elke aanroep van de functie zorgen dat er wat terug gegeven wordt.
Dit snap ik even niet. Op het einde van het script check ik of er:
1. Genoeg highscores zijn.
2. Er simpelweg nooit genoeg zullen zijn.

In beide geval zet ik boolDone op true. Dan komt ie in de statement if(boolDone).
Daar return ik vervolgens:
return $scoreArray;

Hoezo return ik dan nooit?


Aha, als ik het goed begrijp ziet php simpelweg geen return statement?
Het grappige is dat het afgelopen vrijdag wel gewerkt heeft. Nu opeens niet meer. Dus vind ik het sowieso vreemd dat ik dan nooit iets gereturned heb. Maargoed. Ik pas het al ff aan.

[ Voor 15% gewijzigd door IkBenAlles op 11-06-2007 14:23 ]

Samen staan we sterk!


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

En wat doe je met de return value van de filterscores in regel 87?

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!

  • IkBenAlles
  • Registratie: Januari 2002
  • Laatst online: 27-01-2022
Janoz schreef op maandag 11 juni 2007 @ 14:40:
En wat doe je met de return value van de filterscores in regel 87?
Ja goede vraag.

Bedankt in ieder geval. Bleek dus inderdaad zo te zijn dat ik niet elke keer een return deed en dat daardoor het een en ander mis ging.
In ieder geval weer iets geleerd, nogmaals dank...
Michiel

Samen staan we sterk!


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Verwijderd schreef op maandag 11 juni 2007 @ 14:19:
[...]
Ik heb niet topic gelezen dus wellicht behoorlijk uit zijn context, maar:

bv: quicksort(array, begin, end) is redelijk recursief zonder return statement ;)
Niet in PHP. ;)

Hint: array wordt gekopieerd. ;)
m.a.w., je moet dan wel call-by-reference doen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1