webForumDet fria alternativet

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

PHP

2 svar · 230 visningar · startad av aasah

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

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

Medlem sedan aug. 20002 975 inlägg
#2

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:

$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);
Medlem sedan juni 20034 013 inlägg
#3

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?

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)