> So, using count() in a for is bad, but okay in a foreach ?

foreach makes a copy, for and each work directly on the subject.
the reason you were told to evaluate the count into a tmp var was to save the loop from re-evaluating a constant (in most cases, for the duration of the loop) value.


The following snippet illustrates this:
<?php
// for:

// with count: evaluated every iteration:
$r = range(0,4);
for ($i=0; $i<count($r); $i++)
{
  echo "$i: {$r[$i]}\n";
  if ($i == 4) $r[] = 'a';
}

echo "-----\n";

// with tmp var evaluated once:
$r = range(0,4);
$c = count($r);
for ($i=0; $i<$c; $i++)
{
  echo "$i: {$r[$i]}\n";
  if ($i == 4) $r[] = 'a';
}

echo "-----\n";
echo "-----\n";

// foreach:
// always makes a copy (no need for tmp var):
$r = range(0,4);
foreach ($r AS $i => $v)
{
  echo "$i: $v ({$r[$i]})\n";
  if ($i == 4) $r[] = 'a';
}

echo "-----\n";
echo "-----\n";

// each:
// each works directly on the subject:
$r = range(0,4);
while (list($i, $v) = each($r))
{
  echo "$i: $v ({$r[$i]})\n";
  if ($i == 4) $r[] = 'a';
}

?>


Output: [EMAIL PROTECTED]:~/php/tmp$ php loops.php 0: 0 1: 1 2: 2 3: 3 4: 4 5: a ----- 0: 0 1: 1 2: 2 3: 3 4: 4 ----- ----- 0: 0 (0) 1: 1 (1) 2: 2 (2) 3: 3 (3) 4: 4 (4) ----- ----- 0: 0 (0) 1: 1 (1) 2: 2 (2) 3: 3 (3) 4: 4 (4) 5: a (a)

HTH.
Derick is correct, you should revert.

S

Reply via email to