<?php
function generator($array, $prefix) {
foreach ($array as $k => $v) {
yield $prefix . $k => $v;
}
}
function generatorPrefix($array, $prefix = 'prefix') {
return iterator_to_array(generator($array, $prefix));
}
function constructPrefix($array, $prefix = 'prefix') { // 1 loop over data
$result = [];
foreach ($array as $k => $v) {
$result[$prefix . $k] = $v;
}
return $result;
}
function mapKeyAndCombinePrefix($array, $prefix = 'prefix') { // 3 loops over data
return array_combine(
array_map(
fn($k) => $prefix . $k,
array_keys($array)
),
$array
);
}
function walkPrefix($array, $prefix = 'prefix') { // 1 loop over data
$result = [];
array_walk(
$array,
function($v, $k, $prefix) use (&$result) {
$result[$prefix . $k] = $v;
},
$prefix
);
return $result;
}
function reducePrefix($array, $prefix = 'prefix') { // 2 loops over data
return array_reduce(
array_keys($array),
function($result, $k) use ($array, $prefix) {
$result[$prefix . $k] = $array[$k];
return $result;
},
[]
);
}
function returnTime(callable $function, int $repeat = 20)
{
$tests = [];
for ($i = 0; $i < $repeat; ++$i) {
$startTime = microtime(true);
$function();
$endTime = microtime(true);
$tests[] = $endTime - $startTime;
}
// Representing the average
return 1000 * array_sum($tests) / $repeat;
}
$array = range(0, 5000);
foreach (['generatorPrefix', 'constructPrefix', 'mapKeyAndCombinePrefix', 'walkPrefix', 'reducePrefix'] as $test) {
echo "Duration of $test: ", returnTime(fn() => $test($array)) . PHP_EOL;
}
preferences:
32.01 ms | 402 KiB | 5 Q