---
title: "Kan man ändra i en array medan den gås igenom av foreach?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/95136-kan-man-ändra-i-en-array-medan-den-gås-igenom-av-foreach"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "aasah"
published: "2004-01-18T14:05:50.000Z"
updated: "2004-01-18T14:17:56.000Z"
replies: 2
views: 235
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/95136-kan-man-ändra-i-en-array-medan-den-gås-igenom-av-foreach"
---

# Kan man ändra i en array medan den gås igenom av foreach?

## #1 — aasah, 2004-01-18T14:05Z

Om jag går igenom en viss array, $vect, i en foreach-sats, är det säkert att under genomgången sätta om vissa andra tal i $vect? Detta låter rörigt även i mina öron så här kommer lite kod...

Så här har jag skrivit för att vara säker, men då kopieras en hel array:

```
$arr = array(.....) //Innehåller diverse siffror

   function recalc([b]$vect[/b], $alts, $comp) {
      global $arr;
      //ÄNDRAR värde på arr, arr måste vara global
      
      foreach ([b]$vect[/b] as $ix => $value) {
         if (($ix & $alts) && // Någon bit gemensam
             (($ix & $alts) != $alts)) { // Ej lika
            $junk = $ix & $comp;
            if ($junk && $value > 0) { //Det finns något att bortse ifrån
               $rest = $ix - $junk;
               $arr[$rest] += $value;
               $arr[$ix] = 0;
            }
         }
      }
      
   }

[b]recalc($arr, 10, 5)[/b];
```

$vect är alltså en kopia av $arr och det är kopian som gås igenom, medan det ändras i originalet.

Skulle detta vara likvärdigt eller bättre?

```
$arr = array(.....) //Innehåller diverse siffror

   [b]function recalc($alts, $comp)[/b] {
      global $arr;
      //ÄNDRAR värde på arr, arr måste vara global
      
      foreach ([b]$arr[/b] as $ix => $value) {
         if (($ix & $alts) && // Någon bit gemensam
             (($ix & $alts) != $alts)) { // Ej lika
            $junk = $ix & $comp;
            if ($junk && $value > 0) { //Det finns något att bortse ifrån
               $rest = $ix - $junk;
               $arr[$rest] += $value;
               $arr[$ix] = 0;
            }
         }
      }
      
   }

[b]recalc(10, 5);[/b]
```

Allt sker direkt i "originalet".

Någon som vet hur det funkar? :q

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

## #2 — Matte, 2004-01-18T14:15Z

foreach-loopen arbetar med en kopia av den ursprungliga arrayen, så eventuella tilldelningar och ändringar i $arr kommer inte att påverka vad som händer i loopen.

Se följande exempel:

```php
$arr = array(1,2,3);

foreach($arr as $key => $val) {

  $arr[2] = 5;

  if ($key < 10) {
    $arr[] = $key + 4;
  }
  
  echo "$key => $val <br>";

}
echo "<pre>";
print_r($arr);
```

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

## #3 — tydal, 2004-01-18T14:17Z

Att försöka optimera kod i skriptspråk är lite vanskligt eftersom man inte vet hur funktionerna jobbar. Jag antar att du med "men då kopieras en hel array" gärna vill spara både minne och processortid på att inte göra onödiga saker.

Men nu är det dock så att foreach fungerar så att den kopierar hela arrayen och så är det kopian du får leka med i loopen.

Det bästa för din del vore om du kunde använda en vanlig for-loop. Hur ser arrayen ut? Det verkar ju som att indexen  ($ix) består av tal. Vad är det för tal? Följer de något mönster?

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

---

Tråden på webben: https://www.webforum.nu/amne/php/95136-kan-man-ändra-i-en-array-medan-den-gås-igenom-av-foreach
