Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fastest way to add prefix to array keys?

Tags:

arrays

php

What is the fastest way to add string prefixes to array keys?

Input

$array = array(  '1' => 'val1',  '2' => 'val2', ); 

Needed output:

$array = array(   'prefix1' => 'val1',   'prefix2' => 'val2', ); 
like image 878
Kirzilla Avatar asked Apr 09 '10 13:04

Kirzilla


People also ask

How do you replace a key in an array?

The array_replace() function replaces the values of the first array with the values from following arrays. Tip: You can assign one array to the function, or as many as you like. If a key from array1 exists in array2, values from array1 will be replaced by the values from array2.

How do I find the first key of an array?

Starting from PHP 7.3, there is a new built in function called array_key_first() which will retrieve the first key from the given array without resetting the internal pointer. Check out the documentation for more info. You can use reset and key : reset($array); $first_key = key($array);

Can array key be an array?

As array values can be other arrays, trees and multidimensional arrays are also possible. And : The key can either be an integer or a string.


2 Answers

Could do this in one long line I presume:

$array = array_combine(     array_map(function($k){ return 'prefix'.$k; }, array_keys($array)),     $array ); 

Or for versions of PHP prior to 5.3:

$array = array_combine(     array_map(create_function('$k', 'return "prefix".$k;'), array_keys($array)),     $array ); 

There's probably dozens of ways to do this though:

foreach ($array as $k => $v) {     $array['prefix_'.$k] = $v;     unset($array[$k]); } 
like image 81
Lode Avatar answered Oct 07 '22 05:10

Lode


I've found that PHPBench is not a very good source for non-trivial benchmarks. So unless your actually interested in running for(....); it's not going to correctly show which syntax will be faster. I've put together a simple benchmark to show that foreach is actually the fastest when your use both the key and value during the iteration.

It's very important to actually force PHP to read the values from a loop iteration, or else it'll do its best to optimize them out. In the example below I use the doNothing function to force PHP to calculate the key and value each time. Using doNothing will cause an overhead to be applied to each loop, but it will be the same for each loop since the number of calls will be the same.

I wasn't really that surprised that foreach came out on top since it's the language construct for iterating a dictionary.

$array = range( 0, 1000000 );  function doNothing( $value, $key ) {;}  $t1_start = microtime(true); foreach( $array as $key => $value ) {     doNothing( $value, $key ); } $t1_end = microtime(true);  $t2_start = microtime(true); $array_size = count( $array ); for( $key = 0; $key < $array_size; $key++ ) {     doNothing( $array[$key], $key ); } $t2_end = microtime(true);      //suggestion from PHPBench as the "fastest" way to iterate an array $t3_start = microtime(true); $key = array_keys($array); $size = sizeOf($key); for( $i=0; $i < $size; $i++ ) {     doNothing( $key[$i], $array[$key[$i]] ); } $t3_end = microtime(true);  $t4_start = microtime(true); array_walk( $array, "doNothing" ); $t4_end = microtime(true);  print     "Test 1 ".($t1_end - $t1_start)."\n". //Test 1 0.342370986938     "Test 2 ".($t2_end - $t2_start)."\n". //Test 2 0.369848966599     "Test 3 ".($t3_end - $t3_start)."\n". //Test 3 0.78616809845     "Test 4 ".($t4_end - $t4_start)."\n"; //Test 4 0.542922019958 

Edit: I'm using PHP 5.3 on 64-bit Mac OSX 10.6

like image 34
Kendall Hopkins Avatar answered Oct 07 '22 04:10

Kendall Hopkins