我有一个 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';
我可以像这样遍历数据数组:
foreach ($data as $key => $value) {
if ( in_array($key, $keys_to_copy)) {
$copied_data[$key] = $value;
}
}
但这将发生在从 MySQL 结果集中检索数据的循环中。所以这将是一个嵌套在 MySQL 数据循环中的循环。 我通常会尽量避免嵌套循环,除非无法使用 PHP 的内置数组函数来获得我要查找的结果。 但我也厌倦了在 MySQL 数据循环中使用嵌套循环,我不想让 MySQL 闲逛。
我可能不必要地担心嵌套循环的性能,因为我永远不会对超过几百行数据和可能 10 个键执行此操作。
但我想知道是否有一种使用内置 PHP 函数来执行此操作的方法。
我查看了 array_intesect_key()
但这并没有完全做到,因为我的 $keys_to_copy
数组有我想要的键作为数组值而不是键。
有人有什么想法吗?
干杯,B
最佳答案
我已经解决了 - 我几乎把它放在上面了。我想我还是会发布答案以确保完整性。希望这可以帮助别人!
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";
?>
结果...
foreach:662.217s
array_intersect_key:0.099s
因此,在加载数组元素时使用 PHP 数组函数比使用 foreach
要快得多。我认为它会更快,但没有那么多!
关于PHP数组复制某些键,内置函数?嵌套循环性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9740160/