【问题标题】:PHP an array of arrays to one string or one BIG ARRAYPHP 一个数组到一个字符串或一个 BIG ARRAY 的数组
【发布时间】:2013-05-15 16:22:32
【问题描述】:

此代码打开文件夹中的所有 excel 文件,然后获取打开文件中的所有电子邮件并将它们放入数组中。最后,我需要来自所有数组数组的所有内容的一个大数组。我需要它是来自所有文件的所有电子邮件的一大数组。

下面的代码不起作用。我相信这是一个简单的。谢谢

<?

$Folder = "sjc/";
$files = scandir($Folder);


function cleanFolder($file)
{
$string = file_get_contents("sjc/$file");
$pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
preg_match_all($pattern, $string, $matches);

$Emails[] = $matches[0];
return $Emails;
}



function beginClean($files)
{
    for($i=0; count($files)>$i;$i++)
        {
        $Emails = cleanFolder("$files[$i]");
        $TheEmails .= explode(",",$Emails);

        }

/// Supposed to be a big string of emails separated by comma
echo $TheEmails; // But it just echos .... ArrayArrayArrayArrayArray etc...

// WHAT I REALLY WANT IS.. one Array holding all emails, not an Array of Arrays. 
}

beginClean($files);

?>

更新:开始工作了。但是我现在遇到了内存问题,因为电子邮件总数超过 229911。

致命错误:第 33 行 /home/public_html/StatuesPlus/CleanListFolder.php 中允许的内存大小为 67108864 字节已用尽(尝试分配 71 字节)

这是有效的代码:

<?

$Folder = "sjc/";
$files = scandir($Folder);


function cleanFolder($file)
{
//echo "FILE NAME " . $file . "<br>";
$string = file_get_contents("sjc/$file");
$pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
preg_match_all($pattern, $string, $matches);

$TheEmails .= implode(',', $matches[0]);
return $TheEmails;

}



function beginClean($files)
{
    for($i=0; count($files)>$i;$i++)
        {
        $Emails .= cleanFolder("$files[$i]");
        }



$TheEmails = explode(",", $Emails);
//$UniqueEmails= array_unique($TheEmails);
echo count($TheEmails);
//file_put_contents("Emails.txt", $TheEmails);
}

beginClean($files);

?>

【问题讨论】:

  • 而不是原始的 excel 文件至少转换为 csv,然后获取电子邮件是一件轻而易举的事。您的正则表达式与某些有效的电子邮件地址不匹配
  • 谢谢 Dagon,我本来打算这样做,但它有很多 excel 文件。我只知道如何手动完成。此外,此信息不仅仅是电子邮件。我只是在收邮件。是否有通过php将excel转换为csv的代码?
  • 不是通过 php 而是通过命令行:stackoverflow.com/questions/1858195/…

标签: php arrays loops


【解决方案1】:

.= 用于连接字符串,而不是数组。但是您可以将它们作为字符串保留一段时间:

$TheEmails .= ",$Emails";

然后:

$TheEmails = explode(',', substr($TheEmails, 1));

【讨论】:

  • 快。谢谢。我究竟会把这段代码放在哪里?在第一个循环还是第二个循环? substr 和 1 又是做什么的?
  • @PapaDeBeau:substr 只是去掉了前导逗号,因为第一项也得到了逗号。无论如何,$TheEmails .= ",$Emails" 替换了另一条 $TheEmails .= … 行,$TheEmails = explode… 在循环之后。
  • 谢谢。我认为还有一个问题。 $Emails = cleanFolder("$files[$i]");正在将 $Emails 转换为并排列到它实际上不是电子邮件,而是来自另一个循环的数组。
【解决方案2】:

以下是我用来从任何给定文件夹中的多个 Excel 表中收集多封电子邮件的最终代码。 文件可以是 CSV、XLS、XLSX、HTML 等。,此代码将从该文件夹中的多个页面提取电子邮件,并将它们放入一个巨大的阵列中。: )

<?
    // See below for ARRAY out put called $FinalEmails 

    // SET YOUR FOLDER HERE

    $Folder = "sjc/";
    $files = scandir($Folder);


    function cleanFolder($file)
    {

    $string = file_get_contents("$Folder/$file");
    $pattern = '/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i';
    preg_match_all($pattern, $string, $matches);

    $TheEmails .= implode(',', $matches[0]);
    $TheEmails = strtolower($TheEmails);

    return $TheEmails;

    }



    function beginClean($files)
    {
        for($i=0; count($files)>$i;$i++)
            {
            $Emails .= cleanFolder("$files[$i]");
            }



    $TheEmails = explode(",", $Emails);
    $UniqueEmails= array_unique($TheEmails);

    $Emails = implode(",", $UniqueEmails);


    function isValidEmail($email)

    {  
     return filter_var(filter_var($email, FILTER_SANITIZE_EMAIL), FILTER_VALIDATE_EMAIL);  
    }  


    for($i=0; count($UniqueEmails)>$i;$i++)
    {
        if(isValidEmail("$UniqueEmails[$i]"))
        {  
        echo $UniqueEmails[$i] . "<br>";
        $FinalEmails .= "$UniqueEmails[$i],";
        } 
    else 
        {  
        //not valid  
        }
    }


    /// An ARRAY OF Emails from multiple Excel Sheeet Cleaned
    // Cleaned of duplicates and checked if a valid email.
    $FinalEmails = explode(",", $FinalEmails);



    }

    beginClean($files);

    ?>

【讨论】:

  • 如果没有substr$FinalEmails 的最后一个元素将为空。此外,您不必将数组转换为字符串再转换为数组。另外,是否使用了$Emails
  • 它确实可以在没有 substr 的情况下工作。不知道为什么。是的,此示例中未使用 $Emails。感谢您指出了这一点。我会删除它。
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 2010-10-27
相关资源
最近更新 更多