PHP:按爆炸值排序数组

时间:2015-01-15 23:26:42

标签: php arrays sorting explode

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

为了使它更清楚,我将数据存储在文本文件中,格式如下:

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
}

2 个答案:

答案 0 :(得分:1)

使用自定义排序功能:

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);

答案 1 :(得分:0)

这是一种没有自定义排序功能的方法。

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

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