从多个数组计算唯一的电子邮件时,php内存耗尽问题。

时间:2016-06-24 17:53:56

标签: php

<?php
$array1 =   array(
        'abc@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'xyz@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );

$array2 =   array(
        'lmn@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'pqr@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );

$array3 =   array(
        'pqr@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'abc@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );

$array4 =   array(
        'xyz@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'pqr@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );  

$final_arr = array();

$final_arr = array_merge($array1,$array2,$array3,$array4);          

echo count($final_arr);

?>

这是我的示例代码,我有4个数组,每个数组中有2个元素。 我正在使用array_merge()函数在所有数组中获取唯一的电子邮件。

但是通过这种方式我增加了最终数组变量的大小,直到所有数组都没有合并到最终数组中,但这给了我正确的结果,所有数组的唯一电子邮件数量。

如果我使用50个数组,每个数组的大小都有50k个元素。

如果我在单个变量中合并所有数组,这将在php中产生内存耗尽错误,因为大的可变大小。

是否有任何可能的方法通过一些比较来计算来自所有阵列的独特电子邮件以克服内存耗尽问题。

3 个答案:

答案 0 :(得分:3)

我不知道您的阵列是如何存储的以及您在何处使用它们。但是,如果您需要计算唯一的电子邮件 - 然后计数唯一的电子邮件,请不要合并数组。

$array1 =   array(
        'abc@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'xyz@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );

$array2 =   array(
        'lmn@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'pqr@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );

$array3 =   array(
        'pqr@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'abc@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );

$array4 =   array(
        'xyz@example.com'=>array('name'=>'username','ip'=>'127.0.0.1'),
        'pqr@example.com'=>array('name'=>'username','ip'=>'127.0.0.1')
        );  

$unique_emails = array();

foreach ($array1 as $email => $v) {
    if (!isset($unique_emails[$email])) {
        $unique_emails[$email] = 1;
    } else {
        $unique_emails[$email]++;
    }
}

foreach ($array2 as $email => $v) {
    if (!isset($unique_emails[$email])) {
        $unique_emails[$email] = 1;
    } else {
        $unique_emails[$email]++;
    }
}

// for third and forth arrays the same.
print_r($unique_emails);
// outputs Array ( [abc@example.com] => 2 [xyz@example.com] => 2 [lmn@example.com] => 1 [pqr@example.com] => 3 ) 

答案 1 :(得分:1)

如果这是我,我可能会使用哈希作为关联数组键,如下所示:

<?php
$uniqueEmailInfos=Array();
foreach($emailInfos as $emailInfo){
 $key=Sha1(Json_Encode($emailInfo));
 $uniqueEmailInfos[$key]=$emailInfo;
}
?>

您甚至可以尝试通过在进行时取消设置来节省更多内存:

<?php
$uniqueEmailInfos=Array();
foreach($emailInfos as $emailInfo_key=>$emailInfo_value){
 $key=Sha1(Json_Encode($emailInfo_value));
 $uniqueEmailInfos[$key]=$emailInfo_value;
 unset($emailInfos[$emailInfo_key]);
}
?>

循环完成后,$ uniqueEmailInfos应仅包含唯一的电子邮件条目。但这可能效率很低。

如果您的循环已经快/好,并且您唯一的问题是内存,我建议可能会改变&#34; memory_limit&#34;设置php.ini而不是。

答案 2 :(得分:0)

试试这个:

ini_set('memory_limit', '-1');

它从PHP中删除了内存限制,因此你不会耗尽内存 - 尽管对你的数据采取完全不同的方法会更有用,因为你内存耗尽的事实只是意味着它无效。 / p>