打印一个包含数字和字母的排序字符串到文件,查找preg_match解决方案


Print to a file a sorted string with numbers and letters, looking for a preg_match solution

好的,我有一个文本文件,里面有学生编号和相应的名字。我想要得到所有这些数据,正确格式化它们(大写,适当数量的空格,等),并把它们放在另一个文件。原始文本格式有点像这样:

20111101613 XXXXXXXX  , XXXX
20111121235 xxXXXX, xxxxxx
20111134234   XXXX, XxxX
20111104142 XXXXXxxxX, XXXX
20111131231 XX , XXXXXX

的例子:输入文件内容如下所示:

20111112346 Zoomba, Samthing
20111122953 Acosta, Arbyn
20110111241 Smith, John
20111412445 Over, Flow Stack
20111112345 foo, BAR

输出文件的内容应该是这样的:

20111122953 ACOSTA, ARBYN
20111112345 FOO, BAR
20111412445 OVER, FLOW STACK
20110111241 SMITH, JOHN
20111112346 ZOOMBA, SAMTHING

编辑:有人能给我一个提示或解决方案,如何使这个函数使用正则表达式?

function sortslist($infile, $outfile)
{
    // open the input file named conversion.txt
    $inptr = fopen($infile, "r");
    if (!$inptr)
    {
        trigger_error("File cannot be opened: $infile", E_USER_ERROR);
    }
    // initialize student number to zero
    $snum = 0;
    // number of letters in the name string
    $n = 0;
    // initialize the name string to be empty
    $name = "";
    // iteratively scan the input file
    $done = false;
    while (!$done)
    {
        // get each character in the file
        $c = fgetc($inptr);
        // if the character is a digit, add it to the student number
        if (ctype_digit($c))
        {
            $snum = (($snum * 10) + ($c - '0'));
        }
        // else, add to name string including commas and space. Input file might have tabs
        else if (ctype_alpha($c) || ($n > 0 && ($c == " " || $c == "'t")) || $c == ",")
        {
            // append the new character to name string
            $name .= $c;
            // add a space after the comma
            if ($c == ",")
            {
                $name .= " ";
                $n++;
            }
            // increment the number of letters
            $n++;
        }
        // end of the line
        else if ($c == "'n" || !$c)
        {
            // 0 is added to student numbers when newline is detected so neglect them
            if ($snum != 0 && $name != "'n")
            {
                // replace consecutive spaces with one space only
                $name = preg_replace(['/'s's+/', '/'s,/', '/('s*)(?>$)/'], [' ', ',', ''], $name);
                // record student number and name
                $info['snum'][] = $snum;
                $info['name'][] = strtoupper($name);
            }
            // reset the values needed
            $snum = 0;
            $n = 0;
            $name = "";
            // if we hit the end of the file then it is done
            if (!$c)
            {
                $done = true;
            }
        }
    }
    // sort the students names alphabetically
    array_multisort($info['name'], $info['snum']);
    // combine the name strings and there corresponding student number
    $i = 0;
    $students = [];
    $last_student = end($info['snum']);
    foreach ($info['snum'] as $snum)
    {
        $students[$snum] = $snum . " " . $info['name'][$i++];
        // update input file too
        fwrite($inptr, $students[$snum]);
        // don't add a newline to the end of the file
        if ($snum != $last_student)
        {
            $students[$snum] .= "'n";
        }
    }
    // put it into a new file called slist.txt
    file_put_contents($outfile, $students, LOCK_EX);
    // close the input file
    fclose($inptr);
}

您的问题在于$hashtable值在字符串中首先与学生ID一起存储。asort()总是查看值的开头,并根据它排序。因此,为了按名称排序,您必须将学生ID和名称拆分为两个单独的数组,然后使用array_multisort()对它们进行排序。

替换:

$hashtable[$snum] = $snum . " " . strtoupper($name) . "'n";

:

$snums[] = $snum;
$names[] = strtoupper($name);
array_multisort($names, $snums);
$j = 0;
while ($names) {
    $hashtable[$snum] = $snums[$j]. " ". $names[$j]. "'n";
    $j++;
}