Skip to content

Instantly share code, notes, and snippets.

@favila
Created March 19, 2013 08:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save favila/5194460 to your computer and use it in GitHub Desktop.
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)
<?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);
@favila
Copy link
Author

favila commented Mar 19, 2013

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.

array (
  'flatten_for' => 12.559237003326,
  'flatten_for_inplace' => 13.016624927521,
  'flatten_foreach' => 15.639045000076,
  'flatten_foreach_inplace' => 15.924644947052,
  'flatten_foreach_inplace_ref' => 15.724316835403,
  'flatten_map' => 23.687488079071,
  'flatten_walk' => 20.92400598526,
  'flatten_walk_recursive' => 30.347946166992,
  'flatten_reduce' => 16.558449029922,
  'flatten_merge' => 19.951668024063,
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment