Dizinin anahtarları dize eklerler için en hızlı yolu nedir?
Giriş
$array = array(
'1' => 'val1',
'2' => 'val2',
);
Gerekli çıkışı:
$array = array(
'prefix1' => 'val1',
'prefix2' => 'val2',
);
Ben PHPBench olmayan önemsiz kriterler için çok iyi bir kaynak olmadığını tespit ettik. Yani sürece senin for(....); doğru daha hızlı olacak sözdizimi göstermek için gitmiyor çalışan aslında ilgileniyor. Ben foreach aslında hızlı göstermek için birlikte basit bir kriter koyduk zaman kullanımı yineleme sırasında anahtar ve değer hem de.
Bu aslında bir döngü tekrarında gelen değerleri okumak için PHP zorlamak, ya da başka onları optimize etmek için elinden geleni yapacağım çok önemli. Aşağıdaki örnekte ben anahtarı ve değeri her zaman hesaplamak için PHP zorlamak için doNothing işlevini kullanın. DoNothing kullanarak bir tepegöz, her döngü uygulanacak neden olacaktır, ancak aramaların sayısı aynı olacaktır çünkü her döngü için aynı olacaktır.
Ben bir sözlük yinelenmesi için dil oluşumu beri foreach üstüne çıktı gerçekten sürpriz değildi.
$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
Düzenleme: Ben 64-bit Mac OSX 10.6 üzerinde PHP 5.3 kullanıyorum
Sanırım uzun bir çizgide bu yapabilirdi
$array = array_combine(
array_map(function($k){ return 'prefix'.$k; }, array_keys($array))
, $array
);
ya da in-PHP5.3
$array = array_combine(
array_map(create_function('$k', 'return "prefix".$k;'), array_keys($array))
, $array
);
Olsa bunu yollardan onlarca muhtemelen var:
foreach ($array as $k => $v)
{
$array['prefix_'.$k] = $v;
unset($array[$k]);
}
Eğer döngü için kullanmak istemiyorsanız bunu yapabilirsiniz:
// function called by array_walk to change the $value in $key=>$value.
function myfunction(&$value,$key) {
$value="prefix$value";
}
$keys = array_keys($array); // extract just the keys.
array_walk($keys,"myfunction"); // modify each key by adding a prefix.
$a = array_combine($keys,array_values($array)); // combine new keys with old values.
Ben bu for döngü daha verimli olacağını sanmıyorum. Ben array_walk içten bir döngü kullanır ve işlev çağrısı havai burada da var sanırım.