---
title: "Rekursiv felutskrift som kan returnera status"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/178123-rekursiv-felutskrift-som-kan-returnera-status"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "aasah"
published: "2009-04-19T18:29:48.000Z"
updated: "2009-04-19T20:44:31.000Z"
replies: 4
views: 443
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/178123-rekursiv-felutskrift-som-kan-returnera-status"
---

# Rekursiv felutskrift som kan returnera status

## #1 — aasah, 2009-04-19T18:29Z

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:

```php
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:

```php
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???

Permalänk: https://www.webforum.nu/p/178123

## #2 — SPiN, 2009-04-19T18:53Z

Du returnerar aldrig true från funktionen...

Permalänk: https://www.webforum.nu/p/2182419

## #3 — aasah, 2009-04-19T19:17Z

> **[SPiN skrev:](https://www.webforum.nu/p/1465010)**
>
> Du returnerar aldrig true från funktionen...

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

Permalänk: https://www.webforum.nu/p/2182423

## #4 — aasah, 2009-04-19T19:36Z

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 

```php
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

Permalänk: https://www.webforum.nu/p/2182425

## #5 — SPiN, 2009-04-19T20:44Z

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?

```php
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 */
```

Permalänk: https://www.webforum.nu/p/2182431

---

Tråden på webben: https://www.webforum.nu/amne/php/178123-rekursiv-felutskrift-som-kan-returnera-status
