0

我正在尝试按降序对平面文件 (.txt) 进行排序。

这是 file.txt (name, age, ID No.) 中的列表:

Jason, 24, 18299
Bryan, 19, 12999
James, 32, 72990

我的目标是根据第二列按自然降序排列列表。我尝试制作一个 natrsort 函数来反转排列。

这是我想出的:

    <?php
$rows = array();
$result = '';
$data = file('file.txt');

function natrsort(&$array) //the function i made to arrange them in descending order
{
    natsort($array);
    $array = array_reverse($array);
}

foreach($data as $key => $val) {
    $rowarray = explode(",", $val);
    $rows[] = $rowarray[1];
}


natrsort($rows);

//print_r($rows); When I use this, everything seems to work.

foreach($rows as $key => $val) {
 $result .= trim($data[$key]) . "<br/>";
}

echo $result; //display the new sorted list

输出继续显示相同的列表。没有排序发生。也许我错过了什么?

4

1 回答 1

1

当您使用$data[$key],$key等于0,12, 因为array_reverse()重新索引数组。因此,您打印的数组与文件中的数据的顺序相同。

然后,您可以使用natsort(),仅反转键数组:

natsort($rows);
$indexes = array_reverse(array_keys($rows));
foreach ($indexes as $key) {
    $result .= trim($data[$key]) . '<br>';
}

印刷:

James, 32, 72990<br>Jason, 24, 18299<br>Bryan, 19, 12999<br>

另一种方法是使用自定义排序函数进行排序,例如usort()

$result = '';
$data   = file('file.txt');

usort($data, function($a, $b) {
   [, $ageA] = explode(',', $a);
   [, $ageB] = explode(',', $b);
   return intval($ageB) <=> intval($ageA);
});

foreach ($data as $val) {
    $result .= trim($val) . '<br>';
}
echo $result;

输出:

James, 32, 72990<br>Jason, 24, 18299<br>Bryan, 19, 12999<br>
于 2022-02-13T07:47:18.217 回答