BP for Looping through an Array

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



	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




[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux