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

[PHP] array_merge() error

Pagina: 1
Acties:
  • 49 views sinds 30-01-2008

  • Elconejo
  • Registratie: Oktober 2005
  • Laatst online: 12-11 15:03
Ik probeer een bepaalde php file te draaien op m'n website maar krijg steeds volgende fout:

Warning: array_merge() [function.array-merge]: Argument #1 is not an array in AdresVanDeSite\ts2query.php on line 459

Zoals je kan zien is het ts2query.php die ik probeer te runnen. Dit is een file die de details over een teamspeak server toont. Deze heb ik op internet gevonden maar geeft dus een fout op lijn 459 en 460 waarbij 2 arrays gemerged worden. Dit zijn de lijnen waar de fout zich bevind:

PHP:
1
2
3
$result = array();
$result = array_merge($smallerThanPivot, $equalPivot);
$result = array_merge($result, $greaterThanPivot);


Op lijn 422 tot 224 kan je wel duidelijk zien dat de argumenten waardoor de fout veroorzaakt wordt wel degelijk als array gedefinieerd worden.

PHP:
1
2
3
4
        // prepare the sets
        $smallerThanPivot = array();
        $equalPivot = array();
        $greaterThanPivot = array();


Zelf heb ik al proberen een oplossing zoeken via google maar heb niets gevonden. De zoekresulaten leverden een duitse site op waarbij ik niet begrijp of het probleem nu opgelost is of niet. In het Got forum heb ik gezocht met het trefwoord ts2query.php in de hoop dat deze vraag reeds gesteld werd maar ook hier heb ik niets gevonden. Daarom heb ik zelf een nieuw topic gestart en vraag nu of er iemand weet hoe ik dit probleem kan oplossen?

Hieronder een deel van de code waar het over gaat. Ik kon niet de volledige file posten omdat het topic dan te lang werd:

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
38
39
40
41
42
        $smallerThanPivot = array();
        $equalPivot = array();
        $greaterThanPivot = array();
        
        // get the pivot element
        reset($list);
        $pivotElement = current($list);

        // build the sets
        foreach($list as $key => $value) {
            if($sortMethod == "BY_NAME") {
                $comparison = $this->compareChannelNames($value, $pivotElement);
            } else if($sortMethod == "BY_ORDER") {
                $comparison = $this->compareChannelOrders($value, $pivotElement);
            } else if($sortMethod == "BY_PLAYERNAME") {
                $comparison = $this->comparePlayerNames($value, $pivotElement);
            } else if($sortMethod == "BY_PRIVILEGES") {
                $comparison = $this->comparePlayerPrivileges($value, $pivotElement);
            } else {
                die("Whoops, wrong sorting method, ".$sortMethod);
            }// end if

            if($comparison < 0) {
                array_push($smallerThanPivot, $value);
            } else if($comparison == 0) {
                array_push($equalPivot, $value);
            } else {
                array_push($greaterThanPivot, $value);
            }// end if
        }// end foreach
        
        // sort the smaller and greater elements
        $smallerThanPivot = $this->quickSort($smallerThanPivot, $sortMethod);
        $greaterThanPivot = $this->quickSort($greaterThanPivot, $sortMethod);

        // assemble
        $result = array();
        $result = array_merge($smallerThanPivot, $equalPivot);
        $result = array_merge($result, $greaterThanPivot);
        
        return $result;
    }// end function quickSort($list)

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Elconejo schreef op dinsdag 28 augustus 2007 @ 11:18:
Op lijn 422 tot 224 kan je wel duidelijk zien dat de argumenten waardoor de fout veroorzaakt wordt wel degelijk als array gedefinieerd worden.
Dat biedt in PHP dus geen garantie. Er wordt later zowel naar $smallerThanPivot als $greaterThanPivot een assignment gedaan en daarbij kan het type veranderen. Waarschijnlijk geeft quicksort() dus iets anders terug dan jij verwacht. Hoe te debuggen? Eenvoudig, doe een var_dump van beide variabelen. :)

[ Voor 7% gewijzigd door Voutloos op 28-08-2007 11:25 ]

{signature}


  • mithras
  • Registratie: Maart 2003
  • Niet online
T/m je foreach blijft $smallerThanPivot en $equalPivot en $greaterThanPivot wel een array. Maar dan doe je een of andere quickSort die misschien geen array retourneert. Doe eens een var_dump voordat je de arrays merged :)

/edit: Trouwens, van tevoren een variabale definieren geeft geen garantie dat die in een ander type veranderd. Daar is php te los voor, en je kan het afaik wel vastzetten in php5 (binnen een klasse).

[ Voor 31% gewijzigd door mithras op 28-08-2007 11:25 ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 27-11 10:04

André

Analytics dude

Move naar Programming

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
mithras schreef op dinsdag 28 augustus 2007 @ 11:24:
Maar dan doe je een of andere quickSort die misschien geen array retourneert.
Aan de functie zelf te zien is het een implementatie van quicksort en dus gewoon een recursieve call.

TS: waarom gebruik je niet gewoon usort?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:16

Janoz

Moderator Devschuur®

!litemod

Je geeft net wat te weinig informatie. Het was handiger geweest wanneer je de hele functie gepost had. Wat staat er in het stuk hiervoor vanaf 'function($quicksort)'? Ik vermoed namelijk dat daar ergens ook nog een return staat waardoor er ook iets anders dan een array teruggegeven kan worden. Ik las ergens dat in php5 alle parameters van array_merge verplicht een array moeten zijn. Waarschijnlijk staat er in de code boven ergens een return met niks of met enkel 1 element zonder dat deze in een array staat.

Het is trouwens wel mooi om zelf een sorteer routine te implementeren (alhoewel ik vermoed dat het hier gewoon om gedownloade code gaat) maar voor de rest ben ik het helemaal met PrisonerOfPain eens. usort zou in dit geval veel makkelijker zijn (zeker ook omdat het hele compare gedeelte al geschreven is)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Janoz schreef op dinsdag 28 augustus 2007 @ 14:23:
[..] (alhoewel ik vermoed dat het hier gewoon om gedownloade code gaat) [..]
Elconejo schreef op dinsdag 28 augustus 2007 @ 11:18:
[..] Deze heb ik op internet gevonden [..]
Ik weet het zeker denk ik :P

  • Elconejo
  • Registratie: Oktober 2005
  • Laatst online: 12-11 15:03
Bedankt alvast voor de snelle reacties. Zoals eerder vermeld heb ik de file gedownload en bevat deze dus de fout die ik reeds beschreven heb.
Blijkbaar zal de fout dus in die sorteermethode zitten. Zou het kunnen dat deze sorteermethode veranderd is in nieuwere versies van php en dat dit bestand dus in een te oude versie geschreven werd? Of zoek ik het nu te ver?

Een link naar de volledige file:
http://users.telenet.be/Leander/ts2query.php

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:16

Janoz

Moderator Devschuur®

!litemod

Ah, precies wat ik al verwachte:
PHP:
1
2
3
4
    function quickSort($list, $sortMethod) {
        // handle trivial cases first
        if(sizeof($list) == 0) return;
//.......


Vanaf php5 moeten beide argumenten van array_merge een array zijn en de quicksort functie geeft in sommige gevallen geen array terug. Dit zul je dus even op moeten lossen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:16

Janoz

Moderator Devschuur®

!litemod

TheRookie schreef op dinsdag 28 augustus 2007 @ 14:40:
[...]


[...]

Ik weet het zeker denk ik :P
Ik had er zo snel overheen gelezen inderdaad (en vond het verder wel een grappig probleem).

Het is het programming forum inderdaad niet de bedoeling om support te vragen op scripts van derden. Deze thread gaat daarom op slot.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1

Dit topic is gesloten.