webForumDet fria alternativet

in_array fråga

PHP

9 svar · 276 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

Hoppas ni inte tröttnar på mig... :x Vad är det jag inte ser? :q

Ska inte in_array ge true om den sträng man letar efter finns i arrayen? :q Var 17 är felet?

function checkContent(&$quiz) {

   $types = array("RADIO", "CHECKBOX", "SELECT", "TEXT");

   //...

         if ($keyQ > 0 && $keyA > 0) {
            //....            
         }
         elseif ($keyQ > 0) {                    //d)
            $quiz[$keyQ][0][1] = strtoupper($quiz[$keyQ][0][1]);
            echo "quiz[$keyQ][0][1] = ".$quiz[$keyQ][0][1]."<BR>";
            if (!in_array($quiz[$keyQ][0][1], $types)) {
               echo "<pre>Available types are: ";
               foreach($types as $t) echo "$t     ";
               echo "</pre><BR>";
               printParseError("Fel typ av fråga, f = $keyQ, typ = ".$quiz[$keyQ][0][1]);
            }
        }
    //...
}

Skriver ut:

quiz[1][0][1] = RADIO

Available types are: RADIO CHECKBOX SELECT TEXT

ParseError i quizfilen: Fel typ av fråga, f = 1, typ = RADIO

Om den nu har värdet RADIO, hur kan den hamna i anropet till printParseError???

Medlem sedan mars 2003429 inlägg
#2

Förstår inte riktigt vad problemet är, du har inte satt någon else alltså skriver den ju ut allt efter villkoret "elseif ($keyQ > 0)"

Medlem sedan mars 20034 471 inlägg
#3

Du tittar på fel if-sats tror jag... Det är den inre:

if (!in_array($quiz[$keyQ][0][1], $types))

som inte verkar funka. Eller så är det något jättestort jag inte ser...

Medlem sedan mars 2003429 inlägg
#4

ooops sorry my bad =/ tyckte jag hade sett en mer if någon stanns ;)
men då får jag ställa frågan istället, vad vill du att den ska göra/kolla

Medlem sedan aug. 20002 975 inlägg
#5

Kan där finnas någon radbrytning, mellanslag eller liknande i början eller slutet av $quiz[$keyQ][0][1] ?

Någon skillnad om du gör så här ?

if (!in_array(trim($quiz[$keyQ][0][1]), $types))
Medlem sedan mars 2003429 inlägg
#6

Testat att lägga in egna värden och skriva om det lite, men kan inte hitta felet dessvärre =/

Tror på det matte säger om mellanslag, in_array är ju "case sensitive" ;)

Medlem sedan mars 20034 471 inlägg
#7

Matte skrev:

Kan där finnas någon radbrytning, mellanslag eller liknande i början eller slutet av $quiz[$keyQ][0][1] ?
....

Hur funkar foreach? :q Funktionen inleds med:

function checkContent(&$quiz) {

   $types = array("RADIO", "CHECKBOX", "SELECT", "TEXT");

   foreach ($quiz as $keyQ => $frag) {
      foreach($quiz[$keyQ] as $keyA => $alt) {
         foreach($quiz[$keyQ][$keyA] as $ix => $post) {
            //a
            $post = trim($post);
         }
         //...

         if ($keyQ > 0 && $keyA > 0) {
            //....            
         }
         elseif ($keyQ > 0) {                    //d)
            $quiz[$keyQ][0][1] = strtoupper($quiz[$keyQ][0][1]);
            echo "quiz[$keyQ][0][1] = ".$quiz[$keyQ][0][1]."<BR>";
            if (!in_array($quiz[$keyQ][0][1], $types)) {
               echo "<pre>Available types are: ";
               foreach($types as $t) echo "$t     ";
               echo "</pre><BR>";
               printParseError("Fel typ av fråga, f = $keyQ, typ = ".$quiz[$keyQ][0][1]);
            }
        }
    //...
}}

Borde inte det betyda att $quiz inte innehåller några otrimmade värden när detta körs? Eller funkar det inte eftersom vi är mitt i två foreach ??

Förresten... försvinner radbrytningar med trim? För en radbrytning bör där finnas före trim i alla fall...

Medlem sedan mars 20034 471 inlägg
#8

Borde inte dessa två tillsammans plocka bort alla blanka och varje nyradstecken i strängen??

$post = trim($post);
$post = preg_replace('/[\n\r]+/', "", $post);

Likväl är innehållet i min $post (betydligt längre ner) "RADIO" att se till men med längd 9!!! Och efter en del fundering har jag kommit fram till att det nog kan ligga två "nyrad" före och två efter...

Hur blir jag av med dem? :q

Medlem sedan aug. 20002 975 inlägg
#9

Är det för jämförelsens skull så kan du göra som jag föreslog.

Annars är det nog bättre att ge sig på källan, alltså där du byggde upp arrayen.

Du lägger en trimmad variabel i arrayen $post, men sedan använder du aldrig variabeln.

Du borde kunna göra så att du ändrar:
[PHP]// Ändra
$quiz[$keyQ][0][1] = strtoupper($quiz[$keyQ][0][1]);

// Till
$quiz[$keyQ][0][1] = trim(strtoupper($quiz[$keyQ][0][1]));

Medlem sedan mars 20034 471 inlägg
#10

Åh! Tusen tack, Matte!

Jag begrep först här och nu att de värden vi når via variablerna i en foreach-slinga också är kopierade värden. :r Naturligtvis! Nå, den här läxan dröjer det nog innan jag glömmer!

270 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)