使用php从大文本中获取多个信息到数组中

时间:2012-10-23 14:47:28

标签: php split explode

任何人都可以提供以下帮助。我在mysql表中有一个字段“notes”,但需要将它分成一个新表。

该说明目前采用以下格式:

  

在2012年10月22日下午3:50由username1添加

     

说明就在这里

     

在20/10/2012 12:29 pm上由username2添加

     

说明就在这里等等

这里有2个注释作为例子。我怎样才能将它变成一个数组:

[0] => Array(
        [0] username1
        [1] 22/10/2012 3:50pm
        [2] Note1
    )
[1] => Array(
        [0] username2
        [1] 20/10/2012 12:29pm
        [2] Note2
    )

我尝试使用preg_split,但只返回注释,如果按“由日期时间的用户名添加”拆分,因为我不能单独使用“添加”来拆分它,因为注释本身可能包含“添加者”

最好的方法是什么?

由于

2 个答案:

答案 0 :(得分:2)

试试这个

// Get the data from the database
$myData = $row['notes'];

// Split this into an array
$data = explode("\r\n", $myData);

// $data has each line as an element of the array
$key   = -1;
$final = array();
foreach ($data as $element)
{
    // Check if this is the first row
    if (strpos($element, "Added by") > 0)
    {
        $key = $key + 1;
        // This is the first header row. Get the info from it
        $tmp   = str_replace("Added by", "", $element);
        $parts = explode(" on ", $tmp)

        // Add them to the final array
        // Username
        $final[$key][0] = trim($parts[0]);
        // Date
        $final[$key][1] = trim($parts[1]);

        // Initialize the note element
        $final[$key][2] = '';
    }
    else
    {
        // We don't have the 'Added On' so add this as a note.
        $final[$key][2] .= $element;
    }
}

这应该为您提供工作基础。您还可以在备注元素$final[$key][2] .= $element;

中检查空行

答案 1 :(得分:0)

可能你最好的选择是将该字段划分为一系列行,然后遍历每一行。如果你点击一个看起来像Added行的那个,你就有了一个新记录,那么每个后续行都是该记录的一部分......直到你按另一个按行添加。

e.g。

$lines = array(... your monolithic text here ...);
$idx = 0;
$notes = array();
foreach($lines as $line) {
   if (preg_match('/^Added by (.*?) on (.*?)$/', $matches)) {
        $notes[$idx] = array(
             0 => $matches[1], // username
             1 => $matches[2], // date/time
             2 => '' // note text
        )
        continue;
   }
   $notes[$idx[2]] .= $line;
}