webForumDet fria alternativet

Rekursiv felutskrift som kan returnera status

PHP

4 svar · 438 visningar · startad av aasah

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

Jag har en rätt komplex fler-dimensionell array, $arr, som ev kan innehålla fel på vilken nivå som helst och på vilket index som helst. Eller ingenstans. En funktion går igenom arrayen och rapporterar ev funna fel i en matchande felarray. Om jag har ett fel i $arr[$i][$j] kommer felets art att beskrivas i $error[$i][$j] (så jag kan göra något åt det). Efter att $arr kollats vill jag skriva ut alla funna felbeskrivningar i $error. Dessutom vill jag att funktionen rapporterar true/false på om det fanns fel för att kunna köra vidare i skriptet bara om arrayen är rätt.

Ursprungligen hade jag en funktion som nästlade $errors maxdjup antal av foreach-satser på modellen:

function displayErrors(&$error) { 
   $ok = true;
   foreach($error as $ix => $reason) {
      if (!is_array($reason)) {
         if ($reason !== "") {
            printError("Error in pos $ix: $reason");
            $ok = false;
         }
      }
      else {
         foreach ($error[$ix] as $sub => $subReason) {
            if (!is_array($subReason)) {
               if ($subReason !== "") {
                  printError("Error in pos [$ix][$sub]: $subReason");
                  $ok = false;
               }
            }
            else {
               foreach ($error[$ix][$sub] as $s => $what) {
                  if ($what !== "") {
                     printError("Error in pos [$ix][$sub][$s]: $what");
                     $ok = false;
                  }
               }
            } // else
         }
      } // else
   }
   return $ok;
}

$OK = displayErrors($error); 
if ($OK) {
     printToScreen("<p>Syntax OK!</p>");
}
else {
     displayParsedCW($cw);
      printToScreen("<p>Please fix the errors.</p>");
}

Men det känns som om det här borde kunna skrivas mycket vettigare rekursivt:

function displayErrors(&$error, $preIx = '') { 
   foreach($error as $ix => $reason) {
      if (!is_array($reason)) {
         if ($reason !== "") {
            printError("Error in pos $preIx $ix: $reason");
            return false;
         }
      }
      else {
        return displayErrors($reason, $preIx .= '[$ix]');
      } // else
   }
}

//Samma anrop
$OK = displayErrors($error); 
if ($OK) {
     printToScreen("<p>Syntax OK!</p>");
}
else {
     displayParsedCW($cw);
      printToScreen("<p>Please fix the errors.</p>");
}

Men jag får det inte att funka?

Med den ursprungliga funktionen leder inga fel till "Syntax OK", den rekursiva leder till Please fix the errors? Varför???

Medlem sedan mars 20007 896 inlägg
#2

Du returnerar aldrig true från funktionen...

Medlem sedan mars 20034 471 inlägg
#3

SPiN skrev:

Du returnerar aldrig true från funktionen...

:o Ååååh! Tack och lov för extra ögon! Tusen tack!!! :birp

Medlem sedan mars 20034 471 inlägg
#4

Vänta nu ett tag... Det här är ju helt feltänkt. Jag vill ju få ut ALLA felutsktifter inte bara den första. Och om jag ändrar till

function displayErrors(&$error, $preIx = '', $ok = true) { 
   foreach($error as $ix => $reason) {
      if (!is_array($reason)) {
         if ($reason !== "") {
            printError("Error in pos $preIx $ix: $reason");
            $ok = false;
         }
      }
      else {
        displayErrors($reason, $preIx.'[$ix]', $ok);
      } // else
   }
   return $ok;
}

//Om vi har:
$error[1][0] = 'För få fält.';
$error [1][1][0] = '';
$error[2][2][1] = 'Det här borde vara en siffra.';
$error [2][3][0] = '';
$error [2][5] = '';

Skrivs inte [2][2][1]:s false över av de senares '':s true då? :q

Känner att jag villat in mig riktigt här... :OO

Medlem sedan mars 20007 896 inlägg
#5

Lite sent för att tänka klart, men ett sätt är att slänga in ytterligare en parameter till funktionen som referens istället för värde som du gör och istället för att returnera något - vilket antagligen var vad du tänkte?

function displayErrors(&$error, &$hasErrors, $preIx = '') { 
   foreach($error as $ix => $reason) {
      if (!is_array($reason)) {
         if ($reason !== "") {
            printError("Error in pos $preIx $ix: $reason");
            $hasErrors = true;
         }
      }
      else {
        displayErrors($reason, $hasErrors, $preIx.'[$ix]');
      } 
   }
} 
$hasErrors = false;
displayErrors($myErrorStack, $hasErrors);
if ($hasErrors)
    /* Errors found */
else
    /* No errors */
256 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)