[PHP] Array vol binnen functie, maar returned niets

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Ik heb er nu een hele tijd naar gekeken, dingen geprobeerd, maar ik zie niet waarom de functie niet gewoon een array met IP's returned zoals hij ooit heeft gedaan. Ik krijg het ook met geen mogelijkheid meer werkend. Ik heb het over de volgende functie:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function list_ips($from, $to, $loop = 0, $digit = '')
{
    for($i = $from[$loop]; $i <= $to[$loop]; $i++)
    {
        $digit[$loop] = $i;
        if($loop <= 2){ list_ips($from, $to, $loop+1, $digit); }
        if(isset($digit[3]))
        {
            $ips[] = $digit[0].".".$digit[1].".".$digit[2].".".$digit[3];
        }
    }
    return $ips;
}

Hij begint bij de eerste digit van het eerste IP en gaat door tot de eerste digit van het laatste IP. Daarbij moeten ook alle andere digits bekeken worden om te zien of er daar misschien meer van zijn. In mijn geval zijn de eerste drie altijd gelijk en alleen de laatste is anders. Als ik voor de return een print_r doe van $ips (die hij vlak er na moet returnen) krijg ik netjes de verwachte lijst met IP's. Prachtig.

Ik gebruik om de functie aan te roepen:
PHP:
1
$ips = list_ips($array_from, $array_to)

De laatste twee argumenten heeft ie niet nodig, aangezien daar standaardwaarden voor ingevuld zijn. Daar wordt ook verder inet over geklaagd tijdens het parsen.

Als ik nu na het uitvoeren een print_r doe van de $ips waar het array nu in zou moeten zitten dan krijg ik helemaal niets. Daardoor werken andere functies helaas ook niet meer, die doorbouwen op dat array.

Ik heb in de functie zelf op sommige plekken even een echo gedaan van wat er gebeurde. Hij begint netjes met 3x een loop, om vervolgens achter elkaar die IP's in de array te plaatsen. Daarna returned hij in principe 4 keer (van elke loop een keertje + de eerste aanroep), maar dat maakt voor de werking niet uit voor zover ik weet. Ook als ik daar neerzet dat hij alleen als $loop 0 is mag returnen (dus de laatste keer), krijg ik totaal niets terug. Help!

[ Voor 3% gewijzigd door Kaastosti op 11-02-2005 15:30 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Wat moet hij doen met $ips op regel 6 ?

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Het is een recursieve functie. Als hij nog niet 2 keer heeft gelooped, roept hij zichzelf aan, waarbij de int $loop met 1 wordt verhoogd. Dat klopt wel, dat werkt :)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 18-09 22:40

Nick_S

++?????++ Out of Cheese Error

Maar je doet niks met de return waarde van je recursieve functie. Heb je die niet nodig? Waarom roep je hem aan dan?

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Hij gaat zeg maar eerst de diepte in, de loopjes, waarbij er steeds digits worden gezet. Die worden uiteindelijk bij het teruggaan allemaal in de array geplaatst. Er wordt dus uiteindelijk wel wat met de output van de functie gedaan.

Het probleem is hier echter ook niet het vinden van de IP's, maar het rare verschil tussen wat er in de functie zelf returned gaat worden en wat er uiteindelijk buiten de functie van terug te vinden is.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Nee, je vangt de output niet op, dus wordt er niks mee gedaan. Ook van de recursieve calls moet je de output opvangen.

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Als ik van het onderste gedeelte dit maak:
PHP:
1
2
3
4
    echo "<pre>";
    print_r($ips);
    echo "</pre>";
    return $ips;

Krijg ik netjes een lijst IP's over het scherm. Vandaar dat ik er van uit ga dat die array netjes gevuld wordt en dat dat gedeelte werkt. Maar hoe bedoel je dan dat ik de output op moet vangen, er is toch behalve die return geen output van de functie?

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Kaastosti schreef op vrijdag 11 februari 2005 @ 15:56:
Als ik van het onderste gedeelte dit maak:
PHP:
1
2
3
4
    echo "<pre>";
    print_r($ips);
    echo "</pre>";
    return $ips;

Krijg ik netjes een lijst IP's over het scherm. Vandaar dat ik er van uit ga dat die array netjes gevuld wordt en dat dat gedeelte werkt. Maar hoe bedoel je dan dat ik de output op moet vangen, er is toch behalve die return geen output van de functie?
maak daar eens als volgt van

PHP:
1
2
3
4
5
echo "Loop: " . $loop;
echo "<pre>";
    print_r($ips);
    echo "</pre>";
    return $ips;

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Kaastosti schreef op vrijdag 11 februari 2005 @ 15:56:
Als ik van het onderste gedeelte dit maak:
PHP:
1
2
3
4
    echo "<pre>";
    print_r($ips);
    echo "</pre>";
    return $ips;

Krijg ik netjes een lijst IP's over het scherm. Vandaar dat ik er van uit ga dat die array netjes gevuld wordt en dat dat gedeelte werkt. Maar hoe bedoel je dan dat ik de output op moet vangen, er is toch behalve die return geen output van de functie?
Ja, precies. En die return moet je ook bij de recursieve aanroep in een variabele opslaan, anders heeft het geheel toch helemaal geen nut? :? Het feit dat ie zo ook werkt is voor mij reden om te denken dat die functie niet eens recursief hoeft te zijn. :X

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

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Ah ik snap wat je bedoelt... die return moet als argument meegegeven worden aan de functie, om 'm steeds bij te kunnen werken. Waarschijnlijk kan dit ook zonder recursie met een zooi for-loopjes, maar dit vond ik in principe een nettere 'oplossing'.. als het wil werken dan ;)

Ik sla ook in zekere zin de waarde die gevonden wordt wel op in $digit, die vervolgens wel meegegeven wordt aan de functie. Dus in die zin wordt er wat mee gedaan, maar misschien niet helemaal conform standaard :)

Het is alweer een tijd terug dat ik van een dergelijke techniek gebruik maakte, dus het moet er weer even helemaal inslijten :)

[ Voor 14% gewijzigd door Kaastosti op 11-02-2005 16:10 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Kaastosti schreef op vrijdag 11 februari 2005 @ 16:09:
Ah ik snap wat je bedoelt... die return moet als argument meegegeven worden aan de functie, om 'm steeds bij te kunnen werken. Waarschijnlijk kan dit ook zonder recursie met een zooi for-loopjes, maar dit vond ik in principe een nettere 'oplossing'.. als het wil werken dan ;)

Ik sla ook in zekere zin de waarde die gevonden wordt wel op in $digit, die vervolgens wel meegegeven wordt aan de functie. Dus in die zin wordt er wat mee gedaan, maar misschien niet helemaal conform standaard :)
Er wordt iets mee gedaan, maar je slaat de waarde niet op. Commenteer die hele regel 6 eens weg, en dan doet je script waarschijnlijk precies hetzelfde. :P

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

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Neuh, dan gebeurt er _echt_ helemaal niets meer :)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Waarom heb je deze regel,
PHP:
1
       if($loop <= 2){ list_ips($from, $to, $loop+1, $digit); }

als je niets met de return waarde doet? Zo kan 'ie er net zo goed uit.

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Dat is die regel 6 waar NMe het ook over heeft... da's voor het opnieuw aanroepen en kijken naar de volgende digit. Meestal gebruik je zoiets om door een boom heen te lopen oid, maar ik vond 'm hier ook wel grappig :)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Kaastosti schreef op vrijdag 11 februari 2005 @ 16:27:
Dat is die regel 6 waar NMe het ook over heeft... da's voor het opnieuw aanroepen en kijken naar de volgende digit. Meestal gebruik je zoiets om door een boom heen te lopen oid, maar ik vond 'm hier ook wel grappig :)
Wat heb je aan het kijken naar de volgende digit als je niets met het resultaat van dat kijken doet? Ik snap de logica van je redenatie nog steeds niet. :?

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

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Misschien in combinatie met wat meer info:
de $from bevat 4 digits:
[192][168][0][1] (bijvoorbeeld)
de $to bevat 4 andere digits:
[192][168][0][10]

code:
1
for($i = $from[$loop]; $i <= $to[$loop]; $i++)

$from[$loop] is nu nog $from[0], dus 192 --> $i wordt 192
$to[$loop] is ook nog $to[0] en in dit geval ook 192

Daarna wordt $digit[$loop], dus $digit[0] wordt nu 192

Dan, als de loop nog niet genoeg is gedaan, wordt de functie opnieuw aangeroepen maar nu met $loop+1. Hetzelfde speelt zich af, maar nu voor $from[1], $to[1] en $digit[1] wordt naar een ander getal gezet. En zo verder...

Uiteindelijk worden die digits, als het er 4 zijn, achter elkaar gezet en in de array gepropt, die daarna als het goed is gereturned wordt als output van de functie. Tenminste... dat was mijn idee :)
Hij moet bij de eerste beginnen ($digit[$loop] = $i)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als je verhaal klopt, dan zouden al die variabelen static (of global) moeten zijn. En dat kan volgens mij alleen maar als je het static keyword gebruikt...

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

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Global zijn ze in ieder geval niet. De variabelen zelf zijn static, maar het maakt niet uit of ik dat aangeef of niet. Het houdt alleen in, voor zover ik weet, dat ze niet veranderd kunnen worden. Zolang ik er met m'n fikken vanaf blijf worden ze dat ook niet ;)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Static houdt in dat de variabele blijft bestaan als de functie klaar is, en na een volgende aanroep van dezelfde functie heeft deze variabele dan weer de oude waarde. Dat is in feite wat jij beschrijft, en dat werkt bij mijn weten dus ook alleen maar als je expliciet static opneemt in je code.

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

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Maar er wordt niets gewijzigd aan variabelen... en sommige moeten juist niet hetzelfde blijven :) Die $from en $to moeten hetzelfde blijven, maar wordt toch uberhaupt niet veranderd. Alleen de $i veranderd, maar wordt elke keer in de functie zelf gezet. Ook de $digit[$loop] wijzigd, maar die moet dan ook veranderen.

Naar mijn idee zit het qua variabelen wel okee, maar ik begin te twijfelen aan mijn interpretatie van het hele recursieve gedeelte. Volgens mij moet ik daar eerst weer even in duiken voor ik zoiets probeer ;)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

$digit[$loop] wordt gewijzigd maar niet teruggegeven aan de aanroepende functie. Je hebt dus niets aan die wijziging, aangezien deze logischerwijs niet onthouden zou moeten kunnen worden.

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

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 19:59

Kaastosti

Vrolijkheid alom!

Topicstarter
Die wordt dan ook meegegeven met de nieuwe aanroep, om vervolgens mij het teruglopen in de recursie achter elkaar uitgelezen te worden. Tenminste, zo gebeurt het nu wel... waarom krijg ik anders netjes m'n verwachte rijtje IP's?

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

Verwijderd

Doe es:
if($loop <= 2){ list_ips($from, $to, $loop+1, $digit); }
vervangen voor

if($loop <= 2){ ips[] = list_ips($from, $to, $loop+1, $digit); }

De functie die wordt aangeroepen die wordt nergens in opgelsagen

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Kaastosti schreef op vrijdag 11 februari 2005 @ 16:56:
Die wordt dan ook meegegeven met de nieuwe aanroep, om vervolgens mij het teruglopen in de recursie achter elkaar uitgelezen te worden. Tenminste, zo gebeurt het nu wel... waarom krijg ik anders netjes m'n verwachte rijtje IP's?
Ik heb geen idee waarom je die krijgt, daar is geen feitelijke basis voor, althans niet voor zover ik kan zien. :)
Verwijderd schreef op zaterdag 12 februari 2005 @ 14:00:
Doe es:
if($loop <= 2){ list_ips($from, $to, $loop+1, $digit); }
vervangen voor

if($loop <= 2){ ips[] = list_ips($from, $to, $loop+1, $digit); }

De functie die wordt aangeroepen die wordt nergens in opgelsagen
offtopic:
Lees de draad voor je blaat, dat is al door 3 mensen geroepen en praktisch de hele discussie hierboven gaat daarover. :/

'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