Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数组是否复制某些键、内置函数?嵌套循环性能?_Php_Arrays - Fatal编程技术网

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[] =

我有一个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\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我的投票,因为它允许一个干净的一行。。。。如今,这一点越来越重要。