我有一个PHP数组,我想复制,但只复制数组中的复制元素,其键出现在另一个数组中.
这是我的阵列:
$data[123] = 'aaa';
$data[423] = 'bbb';
$data[543] = 'ccc';
$data[231] = 'ddd';
$data[642] = 'eee';
$data[643] = 'fff';
$data[712] = 'ggg';
$data[777] = 'hhh';
$keys_to_copy[] = '123';
$keys_to_copy[] = '231';
$keys_to_copy[] = '643';
$keys_to_copy[] = '712';
$keys_to_copy[] = '777';
$copied_data[123] = 'aaa';
$copied_data[231] = 'ddd';
$copied_data[643] = 'fff';
$copied_data[712] = 'ggg';
$copied_data[777] = 'hhh';Run Code Online (Sandbox Code Playgroud)
我可以像这样遍历数据数组:
foreach ($data as $key => $value) {
if ( in_array($key, $keys_to_copy)) {
$copied_data[$key] = $value;
}
}Run Code Online (Sandbox Code Playgroud)
但这将发生在从MySQL结果集中检索数据的循环中.所以它将是一个嵌套在MySQL数据循环中的循环.我通常会尝试避免嵌套循环,除非没有办法使用PHP的内置数组函数来获取我正在寻找的结果.但是我也厌倦了在MySQL数据循环中有一个嵌套循环,我不想让MySQL闲逛.
我可能不必要地担心嵌套循环性能,因为我永远不会这样做超过几百行数据和10个键.
但是我想知道是否有一种方法可以通过内置的PHP函数来实现.
我看了一下array_intesect_key()但是并没有这么做,因为我的$keys_to_copy数组将我想要的键作为数组值而不是键.
有人有任何想法吗?
干杯,B
bat*_*tad 30
我把它解决了 - 我差点把它放在上面.我想我还是要完整地发布答案.希望这可以帮助别人!
array_intersect_key($data, array_flip($keys_to_copy))
使用array_flip()切换$keys_to_copy,因此它可以内使用array_intersect_keys()
我将运行一些测试来比较上面的手动循环和这个答案之间的性能.我希望内置函数更快,但它们可能相当平等.我知道阵列经过了大量优化,所以我相信它会很接近.
编辑:
我已经使用PHP CLI运行了一些基准测试,将foreach()我的问题中的代码与上面答案中的代码进行比较.结果非常令人震惊.
这是我用来进行基准测试的代码,我认为这是有效的:
<?php
ini_set('max_execution_time', 0);//NOT NEEDED FOR CLI
// BUILD RANDOM DATA ARRAY
$data = array();
while ( count($data) <= 200000) {
$data[rand(0, 500000)] = rand(0, 500000);
}
$keys_to_copy = array_rand($data, 100000);
// FOREACH
$timer_start = microtime(TRUE);
foreach ($data as $key => $value) {
if ( in_array($key, $keys_to_copy)) {
$copied_data[$key] = $value;
}
}
echo 'foreach: '.(microtime(TRUE) - $timer_start)."s\r\n";
// BUILT-IN ARRAY FUNCTIONS
$timer_start = microtime(TRUE);
$copied_data = array_intersect_key($data, array_flip($keys_to_copy));
echo 'built-in: '.(microtime(TRUE) - $timer_start)."s\r\n";
?>Run Code Online (Sandbox Code Playgroud)
结果......
foreach:662.217s array_intersect_key
:0.099s
因此,使用PHP数组函数而不是数组元素的加载速度要快得多foreach.我觉得它会更快但不是那么多!