3v4l.org

run code in 300+ PHP versions simultaneously
<?php // array_values function method_1(Array &$arr) { return $arr === array_values($arr); } // method_2 was DQ; did not actually work // array_keys function method_3(Array &$arr) { return array_keys($arr) === range(0, count($arr) - 1); } // foreach function method_4(Array &$arr) { $idx = 0; foreach( $arr as $key => $val ){ if( $key !== $idx ) return FALSE; ++$idx; } return TRUE; } // guessing function method_5(Array &$arr) { global $METHOD_5_KEY; $i = 0; $l = count($arr)-1; end($arr); if ( key($arr) !== $l ) return FALSE; reset($arr); do { if ( $i !== key($arr) ) return FALSE; ++$i; next($arr); } while ($i < $l); return TRUE; } // naieve function method_6(Array &$arr) { $i = 0; $l = count($arr); do { if ( NULL === @$arr[$i] ) return FALSE; ++$i; } while ($i < $l); return TRUE; } // deep reference reliance function method_7(Array &$arr) { return array_keys(array_values($arr)) === array_keys($arr); } // organic (guessing + array_values) function method_8(Array &$arr) { reset($arr); if ( key($arr) !== 0 ) return FALSE; end($arr); if ( key($arr) !== count($arr)-1 ) return FALSE; return array_values($arr) === $arr; } function benchmark(Array &$methods, Array &$target, $expected){ foreach($methods as $method){ $start = microtime(true); for ($i = 0; $i < 2000; ++$i) { //$dummy = call_user_func($method, $target); if ( $method($target) !== $expected ) { echo "Method $method is disqualified for returning an incorrect result.\n"; unset($methods[array_search($method,$methods,true)]); $i = 0; break; } } if ( $i != 0 ) { $end = microtime(true); echo "Time taken with $method = ".round(($end-$start)*1000.0,3)."ms\n"; } } } $true_targets = [ 'Giant array' => range(0, 500), 'Tiny array' => range(0, 20), ]; $g = range(0,10); unset($g[0]); $false_targets = [ 'Large array 1' => range(0, 100) + ['a'=>'a'] + range(101, 200), 'Large array 2' => ['a'=>'a'] + range(0, 200), 'Tiny array' => range(0, 10) + ['a'=>'a'] + range(11, 20), 'Gotcha array' => $g, ]; $methods = [ 'method_1', 'method_3', 'method_4', 'method_5', 'method_6', 'method_7', 'method_8' ]; foreach($false_targets as $targetName => $target){ echo "==== Benchmark using $targetName expecing FALSE ====\n"; benchmark($methods, $target, false); echo "\n"; } foreach($true_targets as $targetName => $target){ echo "==== Benchmark using $targetName expecting TRUE ====\n"; benchmark($methods, $target, true); echo "\n"; }

preferences:
33.4 ms | 402 KiB | 5 Q