Created
March 19, 2013 08:19
-
-
Save favila/5194460 to your computer and use it in GitHub Desktop.
Braindump of a whole bunch of ways to flatten an array in PHP (with timing harness)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
function flatten_for($arr) { | |
$c = count($arr); | |
$newarr = array(); | |
for ($i = 0; $i < $c; $i++) { | |
$newarr[] = $arr[$i][0]; | |
} | |
return $newarr; | |
} | |
function flatten_for_inplace($arr) { | |
$c = count($arr); | |
for ($i = 0; $i < $c; $i++) { | |
$arr[$i] = $arr[$i][0]; | |
} | |
} | |
function flatten_foreach($arr) { | |
$newarr = array(); | |
foreach ($arr as $value) { | |
$newarr[] = $value[0]; | |
} | |
return $newarr; | |
} | |
function flatten_foreach_inplace($arr) { | |
foreach ($arr as $k => $v) { | |
$arr[$k] = $v[0]; | |
} | |
} | |
function flatten_foreach_inplace_ref($arr) { | |
foreach ($arr as &$value) { | |
$value = $value[0]; | |
} | |
} | |
function flatten_map($arr) { | |
return array_map('current', $arr); | |
} | |
function flatten_walk($arr) { | |
array_walk($arr, function(&$v, $k){$v = $v[0];}); | |
} | |
function visitor($v, $k, &$a) { | |
return $a[] = $v; | |
} | |
function flatten_walk_recursive($arr) { | |
$newarr = array(); | |
array_walk_recursive($arr, 'visitor', $newarr); | |
return $newarr; | |
} | |
function reducer($result, $item) { | |
return $item[0]; | |
} | |
function flatten_reduce($arr) { | |
return array_reduce($arr, 'reducer', array()); | |
} | |
function flatten_merge($arr) { | |
return call_user_func_array('array_merge_recursive', $arr); | |
} | |
function buildarray($length) { | |
return array_map(function($e){return array($e);}, range(0, $length)); | |
} | |
function timeit($callable, $argfactory, $iterations) { | |
$start = microtime(true); | |
for ($i = 0; $i < $iterations; $i++) { | |
call_user_func($callable, call_user_func($argfactory)); | |
} | |
return microtime(true) - $start; | |
} | |
function time_callbacks($callbacks, $argfactory, $iterations) { | |
$times = array(); | |
foreach ($callbacks as $callback) { | |
$times[$callback] = timeit($callback, $argfactory, $iterations); | |
} | |
return $times; | |
} | |
function argfactory() { | |
return buildarray(1000); | |
} | |
$flatteners = array( | |
'flatten_for', 'flatten_for_inplace', 'flatten_foreach', | |
'flatten_foreach_inplace', 'flatten_foreach_inplace_ref', | |
'flatten_map', 'flatten_walk', 'flatten_walk_recursive', | |
'flatten_reduce', 'flatten_merge', | |
); | |
$results = time_callbacks($flatteners, 'argfactory', 10000); | |
var_export($results); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Results with PHP 5.3.15 with Suhosin-Patch (cli) on OS X 10.7.5 on a 2.66GHz MacBook Pro Core 2 Duo.