PHP:按分解值对数组进行排序



如何按分解字符串中的值对数组进行排序?

为了更清楚一点,我以以下格式将数据存储在文本文件中:

Value_1|Value_2|Value_3|Value_4|Value_5
Value_1|Value_2|Value_3|Value_4|Value_5
Value_1|Value_2|Value_3|Value_4|Value_5
...

我使用

$data_file = 'foo.txt';
$lines = file($data_file, FILE_IGNORE_NEW_LINES);

然后分解每一行并输出内容(HTML 剥离以保持干净)

foreach ($lines as $line_num => $dataset) {
  $dataset = explode('|', $dataset);
  //echo exploded values + some HTML
}

但是,在输出数据之前,我想按Value_2(始终是一个数字)从高到低对数组进行排序。我是否必须将数组的键设置为 Value_2 然后对其进行排序?我该怎么做?这里最好的解决方案是什么?

感谢您的帮助!


这是每个感兴趣的人的最终略微修改的片段:

$data_file = 'foo.txt';
$lines = file($data_file, FILE_IGNORE_NEW_LINES);
function sort_data_array($a, $b){
    $ex_a = explode('|', $a);
    $ex_b = explode('|', $b);
    if ($ex_a[1] == $ex_b[1]) {return 0;}
    return ($ex_a[1] > $ex_b[1]) ? -1 : 1;
}
uasort($lines, 'sort_data_array');
$lines = array_values($lines);
foreach ($lines as $line_num => $dataset) {
    //output
}

使用自定义排序函数:

例如:

uasort ($lines, function($a , $b)) {
    $ex_a = explode('|', $a);
    $ex_b = explode('|', $b);
    // change the < to > if they are in reverse...
    return (strcmp($ex_a[1], $ex_b[1]) < 0 ? 1: -1);
}
print_r($lines);

这是一个没有自定义排序函数的方法。

如果列数未知,则可以重构。

<?php
$raw_records = 'Value_1|2|Value_3|Value_4|Value_5
Value_1|5|Value_3|Value_4|Value_5
Value_1|3|Value_3|Value_4|Value_5';
$records = array();
$lines = explode("n", $raw_records);
foreach ($lines as $line_num => $dataset) {
    $dataset = explode('|', $dataset);
    $records[$dataset[1]][] = $dataset[0];
    $records[$dataset[1]][] = $dataset[2];
    $records[$dataset[1]][] = $dataset[3];
    $records[$dataset[1]][] = $dataset[4];
}
ksort($records, SORT_NUMERIC);
echo '<pre>'; var_dump($records); echo '</pre>';
?>

最新更新