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>';
?>
如何根据分解字符串中的值对数组进行排序?
为了更清楚一点,我将数据存储在以下格式的文本文件中:
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>';
?>