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]
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.
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