0

任何人都可以在以下方面提供帮助。我在 mysql 表中有一个“注释”字段,但需要将其分隔到一个新表中。

注释目前采用以下格式:

由 username1 添加于 22/10/2012 3:50pm

笔记在这里

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

注释在这里等等

这里有 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 但它只返回注释如果被“在日期时间由用户名添加”分割,因为我不能单独使用“添加者”来分割它,因为注释本身可能包含“添加者”

最好的方法是什么?

谢谢

4

2 回答 2

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;

于 2012-10-23T15:05:29.773 回答
0

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

例如

$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;
}
于 2012-10-23T15:04:20.960 回答