Hi all. Am wondering if there is a best practice for looping through an 
array, when you need both the item and its position (ie. 1, 2, 3....). The two 
ways I know of:

// the for loop tracks the position and you get each item from the array
        $allFiles = array("coffee.jpg", "tea.jpg", "milk.jpg");
        $numberOfFiles = count($allFiles);
        for ($i=1; $i<=$numberOfFiles; $i++) {
                $currFile = $allFiles[$i - 1]; // since arrays start with 0
                doThisWith($currFile);
                doThatWith($i);
        }

OR:

// the for loop gets each item and you track the position
        $allFiles = array("coffee.jpg", "tea.jpg", "milk.jpg");
        $counter = 1;
        foreach ($allFiles as $currFile) {
                doThisWith($currFile);
                doThatWith($counter);
                $counter += 1;
        }

        Both are the same number of lines, but my tests (see code below) 
indicate that the foreach loop is twice as fast.
        Anyone have a "better" way - faster, more efficient, "cooler", etc.? 
(Or see some flaw in my test code below?)
        Thanks.

George Langley



-- TEST CODE --
<?php
echo "<h1>Loop Test</h1>";

// create a large array
$theArray = array();
for ($i=1; $i<=1000000; $i++) {
        array_push($theArray, $i);
}
$confirmCount = count($theArray);
echo "<h2>An array of $confirmCount items (numbers 1 to $confirmCount) has been 
created.</h2>";

echo "<table><tr><td><b>Type of Loop</b></td><td><b>Time Taken to Add 
Up</b></td><td><b>addUp Value</b></td></tr>";
for ($x=1; $x<=10; $x++) { // run tests 10x
        
        // the for loop tracks the position and you get each item from the array
        $addUp = 0;
        $time_start = microtime(true);
        $numberOfItems = count($theArray);
        for ($i=1; $i<=$numberOfItems; $i++) {
                $currItem = $theArray[$i - 1]; // since arrays start with 0
                $addUp += $currItem; // give it something to do
        }
        $time_end = microtime(true);
        $time = $time_end - $time_start;
        echo "<tr><td>For (Tracks Position): 
</td><td>$time</td><td>$addUp</td></tr>";
        
        // the for loop gets each item and you track the position
        $addUp = 0;
        $time_start = microtime(true);
        $counter = 1;
        foreach ($theArray as $currItem) {
                $addUp += $currItem; // give it something to do
                $counter += 1;
        }
        $time_end = microtime(true);
        $time = $time_end - $time_start;
        echo "<tr><td>Foreach (Tracks Items): 
</td><td>$time</td><td>$addUp</td></tr>";
        
        echo "<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";

}

echo "</table>";

?>
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to