首页 > 解决方案 > 从PHP中的另一个数组中获取数组的每个元素的所有相似元素的最佳方法?

问题描述

所以我在 PHP 中有两个对象数组(每个对象都包含名称和电子邮件)。我正在寻找的是获取第一个数组的每个元素的最快方法,第二个数组中具有相似名称或电子邮件的所有元素(我正在使用similar_text 函数来实现这一点)。

我现在这样做的方式是使用两个 foreach 函数将第一个数组的每个元素与第二个数组的每个元素进行比较(并对结果进行一些自定义,但这并不重要)。有没有更好的方法来实现这一目标?因为对于大量元素,它可能需要很长时间。

我正在使用 PHP 7.3.12,因此可以使用此版本完成的解决方案表示赞赏。

谢谢!

编辑:这是没有我所说的所有自定义的基本代码:

$data = [];

foreach($project_developers as $pd1) {
    $name1 = $pd1->name;
    $email1 = strstr($pd1->email, '@', true);

    foreach($project_developers as $pd2) {
        //Make sure it's not the same developer db entry.
        if($pd1->id != $pd2->id) {
            $name2 = $pd2->name;
            similar_text($name1, $name2, $percent_name);
            
            $email2 = strstr($pd2->email, '@', true);

            similar_text($email1, $email2, $percent_email);

            //If the similarity is greater than 80% we can save it.
            if($percent_name > 80 || $percent_email > 80) {
                if(empty($data[$pd2->id][$pd1->id])) {
                    $data[$pd1->id][$pd2->id] = $pd2;
                }
            }
        }
    }
}

标签: phparraysobjectsearchoptimization

解决方案


array_intersect

您可以使用“array_intersect()”。它返回一个数组,其中包含所有参数中存在的 array1 的所有值。请注意,密钥是保留的。

尝试这个,

    $a = ['name' => 'Randy', 'email' => 'randy@email.com'];
    $b = ['name' => 'Rhoads', 'email' => 'randy@email.com'];
    
    print_r(array_intersect_key($a, $b));

输出 :

    Array([email] => randy@email.com)

推荐阅读