PHP数组是否复制某些键、内置函数?嵌套循环性能?
我有一个PHP数组,我想复制它,但只复制数组中键出现在另一个数组中的元素 以下是我的阵列:PHP数组是否复制某些键、内置函数?嵌套循环性能?,php,arrays,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[] =
$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\u intesect\u key()
,但这还不够,因为我的$keys\u to\u copy
数组将所需的键作为数组值而不是键
有人有什么想法吗
干杯,B我算出来了——我差一点就拿到了上面的答案。为了完整起见,我想我还是把答案贴出来吧。希望这能帮到别人
array\u intersect\u key($data,array\u flip($key\u to\u copy))
使用array\u flip()
将$keys\u切换到\u copy
,以便在array\u intersect\u 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
数组\u相交\u键:0.099s
因此,使用PHP数组函数比使用foreach
更快地加载数组元素。我原以为会快一点,但没那么快 为什么不将整个结果集加载到一个数组中,然后使用嵌套循环开始处理
$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;
}
}
$query\u result=mysql\u query($my\u query)或die(mysql\u error());
$query\u rows=mysql\u num\u rows($query\u result);
对于($i=0;$i<$query\u行;$i++)
{
$row=mysql\u fetch\u assoc($query\u result);
//“key”是包含数据键(123)的列的名称
//“value”是包含该值的列的名称(aaa)
$data[$row['key']=$row['value'];
}
foreach($key=>$value形式的数据)
{
if(在数组中($key,$key\u to\u copy))
{
$copied_data[$key]=$value;
}
}
为什么不使用$keys\u to\u copy
作为主循环?这就是SO的全部目的:帮助他人。即使你最终回答了自己的问题。这是正确的方法。如果翻转操作顺序,则foreach
会变得更快foreach($keys_to_copy AS$key){$copied_data[$key]=$data[$key];}
Up我的投票,因为它允许一个干净的一行。。。。如今,这一点越来越重要。