我有一个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
答案 0 :(得分: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";
?>
结果......
foreach:662.217s
array_intersect_key:0.099s
因此,使用PHP数组函数而不是foreach
来加载数组元素的速度要快得多。我认为它会更快但不是那么多!
答案 1 :(得分:0)
为什么不将整个结果集加载到数组中,然后开始使用嵌套循环进行处理?
$query_result = mysql_query($my_query) or die(mysql_error());
$query_rows = mysql_num_rows($query_result);
for ($i = 0; $i < $query_rows; $i++)
{
$row = mysql_fetch_assoc($query_result);
// 'key' is the name of the column containing the data key (123)
// 'value' is the name of the column containing the value (aaa)
$data[$row['key']] = $row['value'];
}
foreach ($data as $key => $value)
{
if ( in_array($key, $keys_to_copy))
{
$copied_data[$key] = $value;
}
}