Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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_Loops - Fatal编程技术网

使用数组循环查找值的php数组循环

使用数组循环查找值的php数组循环,php,arrays,loops,Php,Arrays,Loops,我有一个二维数组$array_userinfo,包含大约21000个元素。每个元素的第一个位置为“登录”,第二个位置为“电子邮件”。我需要做的是在这个数组中循环,从另一个$array_usermeetingfolder中找到任何匹配的“login”,这是一个包含大约700个元素的一维数组 以下是填充的两个阵列: foreach ($child->children() as $node_principalid) { array_userinfo[$i][0] = (string) $node

我有一个二维数组$array_userinfo,包含大约21000个元素。每个元素的第一个位置为“登录”,第二个位置为“电子邮件”。我需要做的是在这个数组中循环,从另一个$array_usermeetingfolder中找到任何匹配的“login”,这是一个包含大约700个元素的一维数组

以下是填充的两个阵列:

foreach ($child->children() as $node_principalid) {
array_userinfo[$i][0] = (string) $node_principalid->login;
$array_userinfo[$i][1] = (string) $node_principalid->email;
i++;                            
}

foreach (.......) {
$endusersconame =  (string) $usermeetingsfoldersco->children()->name;       
$array_usermeetingfolder[$j] = $endusersconame;//
 $j++;
}
实现这一点的最佳/有效方法是什么?我有一个这样的循环:

for ($k=0;$k < count($array_userinfo);$k++) {
//tempecho($array_userinfo[$k][0]);//will yield login, such as, 'joeblow'
}
for($k=0;$k
谢谢。

一个可能的解决方案:

转换
$array\u usermeetingfolder
,使您拥有一个数组,其中用户登录是键,值是任何东西。例如

$temp = array('joeblow' => 1,
      'someoneelse' => 1,
      ...);
然后在循环中,您只需检查密钥是否存在:

if (isset($temp[$array_userinfo[$k][0]]) {
    echo 'Hoozah!';
}

您还可以使用
array\u key\u exists()
代替isset。您必须运行一些效率更高的测试。

如果可能,您应该使用登录名作为数组密钥,那么您可以快速访问密钥,我认为您不需要考虑性能。PHP中的数组是Hashmaps,如果知道密钥,则可以快速访问它,如果必须检查整个数组,则需要花费更长的时间。如果无法更改,则应考虑从阵列创建数据结构,以提高性能。不知道它是否值得,测量它:)

比如:


以下操作应该有效

for($i=0;$i <= count($firstarray);$i++)
    {
    for ($j=0;$j <= count($secondarray);$j++)
    {
        while($firstarray[$i][0] == $secondarray[$j])
        {
            echo $firstarray[$i][0]; // or $secondarray[$j]
        }

    }



    }

for($i=0;$i)最后需要什么?我会做一些类似于array_intersect(array_map(function($a){return$a['login']}),$array_usermeetingfolder)的事情;最后,如果在较小的数组中找到匹配项,则使用较大数组中的电子邮件传递给函数以向userOP发送电子邮件,而不是执行
for($i=0;$i
我建议先计算计数,然后使用变量数组计数,这样会大大提高性能。@David Harris:稍后会这样做。谢谢。Michael,谢谢。通过如何“转换”$array\u usermeetingfolder?该数组正在另一个For循环中填充:$array\u usermeetingfolder[$j]=$endusersconame;$j++;哦,你跑得更快:-)是的,这样做!再次感谢。我想在这一点上,我可以简单地使用一个代码将工作!这将是一个偶尔使用的管理应用程序,它是循环中的电子邮件部分,可能会影响效率问题,如果出现。无论如何,这是什么代码?一个函数的一部分?什么是$checkback?“如何“转换”$array\u usermeetingfolder?">$checkback。我将您的$array\u userinfo转换为快速搜索数据结构。您可以对其执行任何操作。将其用作方法或函数。或在函数内部使用。我使用了您的命名法。不起作用。我将您的代码放在函数外部;即使在修复代码中的一些语法错误后,我也会收到一个错误:undef未定义索引登录,未定义索引电子邮件。很抱歉太密集了。邮件所在索引的名称是什么?0?和登录名?1我认为,因为您编写了“login”,这是您的arrayNo的键,我从未使用过键方法。我想这就是您的代码出现问题的原因:我使用了[$array\u userinfo[$I][1]=(字符串)$node_principalid->email;$i++];和[$array_usermeetingfolder[$j]=$endusersconame];//$j++;在两个不同的循环中。因此两个数组的值都是基于索引的。这是个坏主意,你在数组键上迭代n*m次。如果你在第一个数组中有21.000个元素,在另一个数组中有700个元素:21000*700=14.700.000如果你有701:14.721.000,是的,这正是发生的事情,正如Fabian所说的。
for($i=0;$i <= count($firstarray);$i++)
    {
    for ($j=0;$j <= count($secondarray);$j++)
    {
        while($firstarray[$i][0] == $secondarray[$j])
        {
            echo $firstarray[$i][0]; // or $secondarray[$j]
        }

    }



    }