如何按爆炸字符串中的值对数组进行排序?
为了使它更清楚,我将数据存储在文本文件中,格式如下:
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
}
答案 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>';
?>