PHP: 按分解值排序数组

PHP: Sort array by exploded value

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

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

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
}

使用自定义排序函数:

EG:

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>';
?>