Avatar billede kjeldsted Novice
23. oktober 2010 - 14:22 Der er 20 kommentarer og
2 løsninger

Array_search() problem.

Hej alle sammen.

Jeg ved ikke rigtig om det er mig den er helt galt med, men jeg kan simpelthed ikke finde hoved eller hale i et ganske simpelt array_search() script.

Jeg har lavet et test script der ser ud som følgende:

function find($needel,$heystack)
{
    if(array_search($needel,$heystack)) return "true";
}

$test = array(1,3,'');

print_r($test);
echo "<br>";

foreach($test as $test2)
{
    echo $test2 . ': ' .gettype($test2) . '- '.find($test2,$test);
    echo "<br>";   
}
echo "<br><br><br><br><br>";
$test = array('',1,3);

print_r($test);
echo "<br>";

foreach($test as $test2)
{
    echo $test2 . ': ' .gettype($test2) . '- '.find($test2,$test);
    echo "<br>";   
}

Jeg undrer mig meget over det resultat jeg får: http://jenskjeldsted.dk/test.php

Hvordan kan det være at jeg i den øverste test IKKE får true på 1 mens jeg gør i den nederste test. Hvad pokker er forskellen på de to?

Håber jeg kan få en god forklaring.
23. oktober 2010 - 15:01 #1
Jeg googlede paa print_r og fandt foelgende info: 

Description
mixed print_r ( mixed $expression [, bool $return = false ] )

print_r() displays information about a variable in a way that's readable by humans.

print_r(), var_dump() and var_export() will also show protected and private properties of objects with PHP 5. Static class members will not be shown.

Remember that print_r() will move the array pointer to the end. Use reset() to bring it back to beginning.

kilde http://php.net/manual/en/function.print-r.php

Hvis du kikker paa dit output vil du se at arrayen har skubbet sig.  Det maa vaere en effekt af print_r.  Hvor du foerst havde 0=>1, 1=>3, 2=>  har du sidst 0=> 1=>1, 2=>3, og med den array er testresultatet korrekt.
Avatar billede kjeldsted Novice
23. oktober 2010 - 15:03 #2
Ja. Hvis du kigger på den kode jeg skrev, har jeg lavet to tests. I den ene hedder arrayet '',1,3 og i den anden hedder det 1,3,''. Det jeg ikke forstår er hvor den kun giver positivt på 1 i den enen test og ikke i dem begge.
Avatar billede kjeldsted Novice
23. oktober 2010 - 15:22 #3
Og desuden sker der absolut intet af at fjerne print_r
23. oktober 2010 - 15:46 #4
Ok, jeg havde ikke spottet at du havde lavet en ny array, derfor antog jeg at print-r der havde skubbet den.  Efter at have kikket paa det igen maa jeg ogsaa give fortabt.  For begge arrays faar du ikke true for den foerste vaerdi og true for de andre uanset hvad der er i.  Saa array_search godkender baade tallene og den tomme string, men det er som om den skal vaagne op og derfor ikke fanger den foerste.  Hvorfor ved jeg ikke.  Jeg haaber hjaelp fra anden side kan goere os begge klogere.
Avatar billede kjeldsted Novice
23. oktober 2010 - 17:12 #5
Og lige en anden lille ting. Print_r kan ikke skubbe resultaterne. Hvis du læser det du selv skrev ("Remember that print_r() will move the array pointer to the end.") Så kan det flytte pointeren til slutningen. Men at flytte pointeren betyder ikke at den laver om på arrayet.
Avatar billede wanze Nybegynder
23. oktober 2010 - 17:29 #6
Hvad er det helt præcis du forsøger at opnå? Hvis du har ét array og du vil se hvor mange af ordene deri er nøgler i et andet array, så kan du bare bruge array_intersect().

Men det kan godt være jeg har misforstået det du forsøger på.
Avatar billede kjeldsted Novice
23. oktober 2010 - 19:09 #7
Det script jeg har skrevet er ikke noget der i sig selv skal bruges til noget. Det var fordi jeg var i gang med at lave et script hvortil jeg ville bruge array_search(). Men da det ikke ville det jeg ville lavede jeg et ganske simpelt test script som er det jeg har skrevet, samt linket til.

Så det jeg egentlig vil er at få svar på hvorfor jeg kun får positivt svar på to ud af tre, når jeg burde få på dem alle.
Avatar billede webweaver Praktikant
24. oktober 2010 - 00:48 #8
Hmm mystisk. Det skulle vel ikke gøre en forskel, hvis du rykker din search direkte ned i løkken, istedet for at køre det som en funktion?
Avatar billede kjeldsted Novice
24. oktober 2010 - 11:54 #9
Nop. Det gør det ikke. Jeg opdagede problemet før jeg forsøgte at lave en loop og en funktion. Lavede blot funktionen og loopet for at se om det var mig selv den var helt galt med.

Men forstår det simpelthen ikke.
Avatar billede webweaver Praktikant
24. oktober 2010 - 12:46 #10
Det giver ikke den store mening! Det burde være fuldstændig ligegyldigt, men det gør heller nogen forskel, om du rykker dit array op over funktionen?
Avatar billede kjeldsted Novice
24. oktober 2010 - 13:04 #11
Selvfølgelig gør det heller ikke nogen forskel. Hvilket det jo heller ikke burde.
Avatar billede Slettet bruger
26. oktober 2010 - 10:45 #12
Skyldes det at, når du "finder" element nr. 1 (index 0) tolker du 0'et som false ?

=> if(array_search($needel,$heystack) === true) return "true";
Avatar billede kjeldsted Novice
26. oktober 2010 - 12:47 #13
Vi kan vel godt blive enige om at hvis du benytter array_search() vil den retunere true hvis der er et resultat og ellers false? Og efter som det første element i arrayet er der bør denne vel også retunere true. Hvis ikke array_search() giver true på første lige meget hvad kan man jo ikke stole på array_search funktionen.
Avatar billede Slettet bruger
26. oktober 2010 - 22:39 #14
Nej, den returnerer positionen i array'et - f.eks. 0
~ som kan misforstås som false.

Derfor skal du bruge "if (x === true)" i stedet for "if (x == true)"
Ved === skal både value og datatype matche (i dette tilfælde boolean)

Returneres 0 (altså første index i arrayet) er datatypen integer.
0 == false  men  0 !== false
26. oktober 2010 - 23:02 #15
T4NKER, det lyder interessant.  Det er for sent (for mange oeller drukket) til at teste det i aften, men det skulle ikke undre mig om du har ret.
Avatar billede Slettet bruger
26. oktober 2010 - 23:58 #16
Ikke helt faktisk - hvis spørgsmålet blot er om et ord optræder i ét af array-elementerne - uanset hvilket:

if (array_search($needle,$heystack) === false)
    return false;
else
    return true;

Samme "poblem" findes i strpos-familien af funktioner:

if (strpos("Man siger så meget", "Man") == false) // kun 2 x =
    return false;
else
    return true;

Vil kontraintuitivt returnere false! (fordi 0 == false)
Avatar billede kjeldsted Novice
27. oktober 2010 - 21:09 #17
Aha. Ser man det. Så er det jo bare mig der har misforstået noget dér. Kan faktisk godt se nu på PHP.net er det er noget sludder jeg har haft sagt.

Men hvordan kan man så få PHP til at se forskellen på 0 og false?
27. oktober 2010 - 22:16 #18
Samme problem som i gaar ved samme tid: for sent og for mange oeller.  Men jeg foelger debatten.
30. oktober 2010 - 09:35 #19
Kjeldsted, saa fik jeg kikket paa det igen, og jeg opdager at T4NK3R har givet loesningen selv om det aabenbart ikke gik op for nogen af os.  Jeg har nu testet din kode undtagen at jeg i funktionen har indsat dette som jeg har taget direkte fra #16

if (array_search($needle,$heystack) === false) return false;
else return true;

Resultatet kan du se her: http://christianjorgensen.be/kjeldsted.php .
Avatar billede kjeldsted Novice
05. november 2010 - 22:48 #20
Mange tak for hjælpen

Smid nogle svar så der kan gives nogle points :)
05. november 2010 - 23:45 #21
Svar fra mig.
Avatar billede Slettet bruger
06. november 2010 - 22:12 #22
Hvem mig ?!?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester