PHP数组复制某些键,内置函数?嵌套循环性能?

标签 php arrays

我有一个 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/

相关文章:

java - 将 Java servlet 添加到 WAMP 配置机器的最简单方法是什么?

php - PDO 无法在其他无缓冲查询处于事件状态时执行查询

c - 如何使用使用 128 位二进制和 4 位多项式模的 C 编写模块化运算?

javascript - 当我将数组索引存储为变量时,代码不起作用

Java 找不到循环符号,逻辑问题?

php - 使用 MySQLi 进行无缓冲查询?

php - Guzzle cookies 处理

javascript - 禁用输入日期但检索值

php - 在 CakePhp 中组合数组

c# - 为什么我在生成 Random() 数字时会得到奇怪的结果?