使用php搜索大型数组中的元素

时间:2017-12-21 10:50:22

标签: php arrays

我有两个数组:一个是从mySQL数据库中提取的数据生成的,数据超过100k。每个元素都是一个关联数组。

现在,我需要从第二个数组中获取每个元素并在第一个数组中搜索它(使用某些键进行比较),如果它不存在,则添加它。

示例:

$array1 = [
    [
        'uuid' => 001,
        'name' => 'Isaak',
        'surname' => 'Newton',
    ],
    [
        'uuid' => 002,
        'name' => 'George',
        'surname' => 'Washington',
    ],
    [
        'uuid' => 003,
        'name' => 'Harry',
        'surname' => 'Potter',
    ],
    [
        'uuid' => 004,
        'name' => 'John',
        'surname' => 'Doe',
    ],
    [
        'uuid' => 005,
        'name' => 'Jack',
        'surname' => 'Daniels',
    ],
    [
        'uuid' => 007,
        'name' => 'Donnie',
        'surname' => 'Trump',
    ],
    [
        'uuid' => 008,
        'name' => 'Donnie',
        'surname' => 'Trump',
    ]
];

然后,第二个数组

$array2 = [
    [
        'name' => 'Carl',
        'surname' => 'Sagan',
    ],
    [
        'name' => 'Giorgio',
        'surname' => 'Armani',
    ],
    [
        'name' => 'Harry',
        'surname' => 'Potter',
    ]
];

在这个例子中,Carl Sagan和Giorgio Armani将被添加到$ array1。目前我正在循环$ array1,查看是否存在具有相同名称和姓氏的元素。如果没有,则添加它。

问题是,根据我拥有的值的数量,脚本需要2个多小时才能完成。

我用来检查元素是否已存在的函数是:

foreach ($array2 as $array2Element)
    foreach ($array1 as $array1Element) {
        if ($array1Element['name'] == $array2Element['name'] &&
            $array1Element['surname'] == $array2Element['surname']
        ) {
            // Both keys matched, the element already exists!
            $found = true;
            break;
        }
    }
}

有没有更有效的方法来做到这一点?

PS:数据是一个我无法控制的数组。如果有帮助,我可以添加新密钥,但我无法将其更改为另一种数据结构。

1 个答案:

答案 0 :(得分:2)

  1. 索引两个数组以使用比较条件作为键。 E.g:

    $array1 = [
        'Isaak|Newton' => [
            'uuid' => 001,
            'name' => 'Isaak',
            'surname' => 'Newton'
        ],
        ...
    ];
    

    确保您创建了一个唯一的密钥,因此两个不同的名称不会意外地连接到同一个密钥。

  2. 将两个数组一起添加:

    $array3 = $array1 + $array2;
    
  3. 再次删除密钥:

    $array3 = array_values($array3);